1. 程式人生 > >Leetcode 319.燈泡開關

Leetcode 319.燈泡開關

燈泡開關

初始時有 個燈泡關閉。 1 輪,你開啟所有的燈泡。 2 輪,每兩個燈泡你關閉一次。 3 輪,每三個燈泡切換一次開關(如果關閉則開啟,如果開啟則關閉)。第 i 輪,每 個燈泡切換一次開關。對於第 輪,你只切換最後一個燈泡的開關。找出 輪後有多少個亮著的燈泡。

示例:

輸入: 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 }