初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。
第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。
找出并返回 n 轮后有多少个亮着的灯泡。
示例 1:
319.灯泡开关 - 图1

  1. 输入:n = 3
  2. 输出:1
  3. 解释:
  4. 初始时, 灯泡状态 [关闭, 关闭, 关闭].
  5. 第一轮后, 灯泡状态 [开启, 开启, 开启].
  6. 第二轮后, 灯泡状态 [开启, 关闭, 开启].
  7. 第三轮后, 灯泡状态 [开启, 关闭, 关闭].
  8. 你应该返回 1,因为只有一个灯泡还亮着。

示例 2:

  1. 输入:n = 0
  2. 输出:0

示例 3:

  1. 输入:n = 1
  2. 输出:1

提示:

  • 0 <= n <= 10^9

解法一:迭代(超时)

  1. func bulbSwitch(n int) int {
  2. status := make([]bool, n)
  3. for i := range status {
  4. status[i] = true
  5. }
  6. for i := 2; i <= n; i++ {
  7. for j := 0; j < n; j++ {
  8. if (j+1)%i == 0 {
  9. status[j] = !status[j]
  10. }
  11. }
  12. }
  13. res := 0
  14. for i := 0; i < n; i++ {
  15. if status[i] {
  16. res++
  17. }
  18. }
  19. return res
  20. }

解法二:找规律

在解法一的基础上,我把 1- 16 输出出来,发现其实就是 319.灯泡开关 - 图2 的结果取整

  1. func bulbSwitch(n int) int {
  2. return int(math.Sqrt(float64(n)))
  3. }