1. 题目
初始时有 n 个灯泡处于关闭状态。
对某个灯泡切换开关意味着:如果灯泡状态为关闭,那该灯泡就会被开启;而灯泡状态为开启,那该灯泡就会被关闭。
第 1 轮,每个灯泡切换一次开关。即,打开所有的灯泡。
第 2 轮,每两个灯泡切换一次开关。 即,每两个灯泡关闭一个。
第 3 轮,每三个灯泡切换一次开关。
第 i 轮,每 i 个灯泡切换一次开关。 而第 n 轮,你只切换最后一个灯泡的开关。
找出 n 轮后有多少个亮着的灯泡。
提示:
- 0 <= n <= 109
2. 解题思路
题目简化:
有 n
个灯泡,从 1 到 n,最开始全部是关着的。
然后你会进行 n
轮操作:
- 第 1 轮:你把所有灯泡的开关拨一次(全开)。
- 第 2 轮:你拨动所有编号是 2 的倍数的灯泡(2、4、6…)。
- 第 3 轮:你拨动所有编号是 3 的倍数的灯泡(3、6、9…)。
- …
- 第 n 轮:你拨动所有编号是 n 的倍数的灯泡。
最后问你:有多少个灯泡是亮着的?
一个灯泡最终会亮着的前提是它被拨动了奇数次。
因为:
- 关 → 开(第1次拨动)
- 开 → 关(第2次拨动)
- …
- 如果总共拨动奇数次,它就开着;
- 偶数次,它就关着。
那接下来是不是求一个灯泡被拨动多少次?
以第 k 个灯泡为例:
- 它会在 所有能整除 k 的轮数中被拨动一次。
- 换句话说,它会被拨动的次数 = k 的因数个数。
🔍 举个例子:
灯泡 6:
- 因数有:1, 2, 3, 6(共 4 个)→ 被拨动 4 次 → 最终关闭。
灯泡 9:
- 因数有:1, 3, 9(共 3 个)→ 被拨动 3 次 → 最终打开。
所以:
- 一般因数成对出现:如 12 的因数有 (1,12), (2,6), (3,4) → 一共 6 个
- 但如果是完全平方数,比如 9:因数是 (1,9), (3,3) → 因数 3 重复了一次,所以总数是奇数
✅ 所以,最终亮着的灯泡的个数 = 小于等于 n 的平方数的个数
[!example]
n = 10 时,小于等于 10 的平方数是:
- 1² = 1
- 2² = 4
- 3² = 9
3. 代码
class Solution {
public int bulbSwitch(int n) {
return (int) Math.sqrt(n);
}
}