每日刷題 燈泡開關

2021-09-09 05:15:57 字數 1238 閱讀 3141

示例:

輸入: 3

輸出: 1

解釋:初始時, 燈泡狀態 [關閉, 關閉, 關閉].

第一輪後, 燈泡狀態 [開啟, 開啟, 開啟].

第二輪後, 燈泡狀態 [開啟, 關閉, 開啟].

第三輪後, 燈泡狀態 [開啟, 關閉, 關閉].

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

解答:首先給一種列舉的解法:開闢大小為n的陣列,分別針對第i = 0,1,2,3…n 輪進行操作。

**:

int

bulbswitch

(int n)

else

state[n-1]

*=-1

, k++;}

int sum =0;

for(

int i =

0; i < n; i++)if

( state[i]==1

) sum++

;return sum;

}

執行結果:emmm…當n = 99999999時候超時。

優化:既然暴力列舉無法解決問題,那麼肯定有簡單的方法。老方法:找規律。用上述**執行n = 1~100的情況,發現規律如下:n = 0 時, 結果為0;n = 1~3 時,結果為1;n = 4~8 時,結果為2;n = 9~15 時,結果為3;n = 16~24 時,結果為4…ok,結論已經很明顯了。

**:

int

bulbswitch

(int n)

執行結果:

討論:為什麼會等於sqrt(n)這樣的結果?

初始時燈泡全部關閉,對於除最後乙個之外的每乙個燈泡,如果最終結果為亮,那麼需要進行奇數次開關操作,所以只有因子個數為奇數的燈泡序號才會結果為亮,而只有平方數的因子數為奇數,例如4 = 1 * 2 = 2 * 2, 而12 = 1 * 12 = 2 * 6 = 3 * 4。

對於最後乙個燈泡,如果不是平方數,一定是暗著的;反之是亮著的。

演算法題 燈泡開關問題

問題描述 有編號1 100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。現在開始按開關。第1個同學,把所有的燈泡開關都按一次 按開關燈的編號 1,2,3,100 第2個同學,隔乙個燈按一次 按開關燈的編號 2,4...

319 燈泡開關

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

319 燈泡開關

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