1. 程式人生 > >Bulb Switcher 燈泡開關

Bulb Switcher 燈泡開關

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

示例:

輸入: 3
輸出: 1 
解釋: 
初始時, 燈泡狀態 [關閉, 關閉, 關閉].
第一輪後, 燈泡狀態 [開啟, 開啟, 開啟].
第二輪後, 燈泡狀態 [開啟, 關閉, 開啟].
第三輪後, 燈泡狀態 [開啟, 關閉, 關閉]. 

你應該返回 1,因為只有一個燈泡還亮著。

思路:這道題直接返回這個數的開根號值,基本原理是,假設這個數為n,則這個數會有n輪,我們只要保證對應第i個燈泡轉換了奇數輪(比如n=100,要保證第i=5個燈泡最後是亮的,那麼第5個燈泡只能被轉換奇數次),那麼什麼數才能保證只轉換奇數次呢?由於會有n輪(對應1-n),所以每個數字至少會被轉換一次,如果這個數可以分解,比如36=1*36=2*18=3*12=4*9=6*6,那麼在對應第1,36,2,18,3,12,4,9,6輪都會被轉換,且前面四對都是成對出現的,所以只有第6輪單獨出現,所以第36個燈最後是亮的。

同理,對於第35個燈,我們也可以這麼分析,最後我們會發現,只有當一個數是平方數的時候,最後一定是亮的,因為沒有任何一個數和sqrt(n)對應,這個數最後被轉換的次數是奇數。所以最後就變成了我們需要找到1-n範圍內的平方數即可。可以直接sqrt(n),也可以用傳統方法統計。

參考程式碼:

class Solution {
public:
    int bulbSwitch(int n) {
        return (int)(sqrt(n));
    }
};