There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it's off or turning off if it's on). For the nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.html
Example:函數
Given n = 3.
At first, the three bulbs are [off, off, off]. After first round, the three bulbs are [on, on, on]. After second round, the three bulbs are [on, off, on]. After third round, the three bulbs are [on, off, off].
So you should return 1, because there is only one bulb is on.
這道題給了咱們n個燈泡,第一次打開全部的燈泡,第二次每兩個更改燈泡的狀態,第三次每三個更改燈泡的狀態,以此類推,第n次每n個更改燈泡的狀態。讓咱們求n次後,全部亮的燈泡的個數。此題是CareerCup 6.6 Toggle Lockers 切換鎖的狀態。spa
那麼咱們來看這道題吧,仍是先枚舉個小例子來分析下,好比只有5個燈泡的狀況,'X'表示滅,‘√’表示亮,以下所示:code
初始狀態: X X X X Xhtm
第一次: √ √ √ √ √blog
第二次: √ X √ X √three
第三次: √ X X X √leetcode
第四次: √ X X √ √get
第五次: √ X X √ Xit
那麼最後咱們發現五次遍歷後,只有1號和4號燈泡是亮的,並且很巧的是它們都是平方數,是巧合嗎,仍是其中有什麼玄機。咱們仔細想一想,對於第n個燈泡,只有當次數是n的因子的以後,才能改變燈泡的狀態,即n能被當前次數整除,好比當n爲36時,它的因數有(1,36), (2,18), (3,12), (4,9), (6,6), 能夠看到前四個括號裏成對出現的因數各不相同,括號中前面的數改變了燈泡狀態,後面的數又變回去了,等於燈泡的狀態沒有發生變化,只有最後那個(6,6),在次數6的時候改變了一次狀態,沒有對應其它的狀態能將其變回去了,因此燈泡就一直是點亮狀態的。因此全部平方數都有這麼一個相等的因數對,即全部平方數的燈泡都將會是點亮的狀態。
那麼問題就簡化爲了求1到n之間徹底平方數的個數,咱們能夠用force brute來比較從1開始的徹底平方數和n的大小,參見代碼以下:
解法一:
class Solution { public: int bulbSwitch(int n) { int res = 1; while (res * res <= n) ++res; return res - 1; } };
還有一種方法更簡單,咱們直接對n開方,在C++裏的sqrt函數返回的是一個整型數,這個整型數的平方最接近於n,即爲n包含的全部徹底平方數的個數,參見代碼以下:
解法二:
class Solution { public: int bulbSwitch(int n) { return sqrt(n); } };
討論:這道題有個follow up就是,若是咱們toggle的順序不是1,2,3,4...,而是1,3,5,7...,或者是2,4,6,8... 的話,還怎麼作?博主沒有想出像解法二那樣簡便的方法,只是大概想了想,若是各位大神有更好的方法,請必定要在下方留言啊。博主想的是,好比對於1,3,5,7...,那麼就是先把全部的燈點亮,而後關掉3,6,9,12,15...等的燈,而後toggle的是5,10,15...等等,而後再toggle的是7,14,21...,咱們發現,純2的倍數的燈永遠不會被改變,好比2,4,8,16... 這些燈狀態不會變,有些燈只會變一次,好比3,6,9等,而有些燈會變兩次,好比15(3x5),21(3x7),35(5x7)等,有些燈會變三次,好比105(3x5x7),那麼咱們能夠觀察出規律了,toggle的次數跟奇數因子的數字有關(注意這裏的奇數因子不包括1),只要有奇數個奇因子,那麼燈就是滅的,只要有偶數個奇因子,那麼燈就是亮的。
相似題目:
參考資料:
https://leetcode.com/problems/bulb-switcher/discuss/77104/Math-solution..
https://leetcode.com/problems/bulb-switcher/discuss/77112/Share-my-o(1)-solution-with-explanation