初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
Example:
Input: 3
Output: 1
Explanation:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].
你应该返回 1,因为只有一个灯泡还亮着。
【思路】
某个灯泡切换
1次是 开启
2次是关闭
3次是开启
…
===》奇数次是开启,偶数次是关闭
求灯泡切换次数奇数次的个数就是亮着的灯泡个数。
假设有n个灯泡 初始状态都是关闭状态00000000000…0
第一轮打开所有灯泡 11111111111…1
第二轮切换 第2 ,4 ,6,8 ,10…个 灯泡10101010101010…
第三轮切换 第3 ,6 ,9 ,12…个 灯泡100011100011 …
…
第i轮切换第 i*k (k = 1,2,3,4,)个灯泡。
所以每个灯泡被切换的次数就是它有多少个约数
6 = 3 2 ,6 = 16 ==》2 和3 1和6 都是6的约数,所以约数是成对出现的,但4 = 2*2 2 只算一个约数
若 i =a^2 ,则约数为奇数,即切换奇数次
class Solution {
public:
int bulbSwitch(int n) {
int count = 0;
for(int i = 1; i*i <= n; i++)
count++;
return count ;
}
};
看到discuss里有直接开根的,意思是 如果 n/ i = i, 则 0< k < i ,都有 k^ 2 < n;即有 i 个数可以是k^2