Leetcode 319.燈泡開關
燈泡開關
初始時有 n 個燈泡關閉。第 1 輪,你開啟所有的燈泡。第 2 輪,每兩個燈泡你關閉一次。第 3 輪,每三個燈泡切換一次開關(如果關閉則開啟,如果開啟則關閉)。第 i 輪,每 i 個燈泡切換一次開關。對於第 n 輪,你只切換最後一個燈泡的開關。找出 n 輪後有多少個亮著的燈泡。
示例:
輸入: 3
輸出: 1
解釋:
初始時, 燈泡狀態 [關閉, 關閉, 關閉].
第一輪後, 燈泡狀態 [開啟, 開啟, 開啟].
第二輪後, 燈泡狀態 [開啟, 關閉, 開啟].
第三輪後
你應該返回 1,因為只有一個燈泡還亮著。
A bulb ends up on iff it is switched an odd number of times.
Bulb i is switched in round d iff d divides i. So bulb i ends up on iff it has an odd number of >divisors.
Divisors come in pairs, like i=12 has divisors 1 and 12, 2 and 6, and 3 and 4. Except if i is a >square, like 36 has divisors 1 and 36, 2 and 18, 3 and 12, 4 and 9, and double divisor 6. So bulb >i ends up on iff and only if i is a square.
So just count the square numbers.
大概解釋一下,當一個燈泡被執行偶數次switch操作時它是關著的,當被執行奇數次switch操作時它是開著的,那麼這題就是要找出哪些編號的燈泡會被執行奇數次操作。
現在假如我們執行第i
次操作,即從編號i開始對編號每次+i進行switch操作,對於這些燈來說,
如果其編號j(j=1,2,3,⋯,n)能夠整除i,則編號j的燈需要執switch操作。
具備這樣性質的i是成對出現的,比如:
j=12時,編號為12的燈,在第1次,第12次;第2次,第6次;第3次,第4次一定會被執行Switch操作,這樣的話,編號為12的等肯定為滅。
但是當完全平方數36就不一樣了,因為他有一個特殊的因數6,這樣當i=6時,只能被執行一次Switch操作,這樣推出,完全平方數一定是亮著的,所以本題的關鍵在於找完全平方數的個數。
1 class Solution { 2 public int bulbSwitch(int n) { 3 return (int) Math.sqrt(n); 4 } 5 }