初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。
第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。
找出并返回 n 轮后有多少个亮着的灯泡。
示例 1:
输入:n = 3输出:1解释:初始时, 灯泡状态 [关闭, 关闭, 关闭].第一轮后, 灯泡状态 [开启, 开启, 开启].第二轮后, 灯泡状态 [开启, 关闭, 开启].第三轮后, 灯泡状态 [开启, 关闭, 关闭].你应该返回 1,因为只有一个灯泡还亮着。
示例 2:
输入:n = 0输出:0
示例 3:
输入:n = 1输出:1
提示:
0 <= n <= 10^9
解法一:迭代(超时)
func bulbSwitch(n int) int {status := make([]bool, n)for i := range status {status[i] = true}for i := 2; i <= n; i++ {for j := 0; j < n; j++ {if (j+1)%i == 0 {status[j] = !status[j]}}}res := 0for i := 0; i < n; i++ {if status[i] {res++}}return res}
解法二:找规律
在解法一的基础上,我把 1- 16 输出出来,发现其实就是 的结果取整
func bulbSwitch(n int) int {return int(math.Sqrt(float64(n)))}
