目录
319. 灯泡开关 Bulb Switcher 🌟🌟
672. 灯泡开关II Bulb Switcher ii 🌟🌟
🌟 每日一练刷题专栏 🌟
Rust每日一练 专栏
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
319. 灯泡开关 Bulb Switcher
初始时有 n
个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。
第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i
轮,你每 i
个灯泡就切换第 i
个灯泡的开关。直到第 n
轮,你只需要切换最后一个灯泡的开关。
找出并返回 n
轮后有多少个亮着的灯泡。
示例 1:
输入:n = 3 输出:1 解释: 初始时, 灯泡状态 [关闭, 关闭, 关闭]. 第一轮后, 灯泡状态 [开启, 开启, 开启]. 第二轮后, 灯泡状态 [开启, 关闭, 开启]. 第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 你应该返回 1,因为只有一个灯泡还亮着。
示例 2:
输入:n = 0 输出:0
示例 3:
输入:n = 1 输出:1
提示:
0 <= n <= 10^9
代码:
package main
import "fmt"
func bulbSwitch(n int) int {
bulbs := make([]bool, n)
for i := 0; i < n; i++ {
for j := i; j < n; j += i + 1 {
bulbs[j] = !bulbs[j]
}
}
count := 0
for _, b := range bulbs {
if b {
count++
}
}
return count
}
func main() {
fmt.Println(bulbSwitch(3))
fmt.Println(bulbSwitch(0))
fmt.Println(bulbSwitch(1))
}
输出:
1
0
1
其实本题只用一个公式就能解决:
```golang
func bulbSwitch(n int) int {
return int(math.Sqrt(float64(n)))
}
```
672. 灯泡开关II Bulb Switcher ii
现有一个房间,墙上挂有 n
只已经打开的灯泡和 4 个按钮。在进行了 m
次未知操作后,你需要返回这 n
只灯泡可能有多少种不同的状态。
假设这 n
只灯泡被编号为 [1, 2, 3 ..., n],这 4 个按钮的功能如下:
- 将所有灯泡的状态反转(即开变为关,关变为开)
- 将编号为偶数的灯泡的状态反转
- 将编号为奇数的灯泡的状态反转
- 将编号为
3k+1
的灯泡的状态反转(k = 0, 1, 2, ...)
示例 1:
输入: n = 1, m = 1. 输出: 2 说明: 状态为: [开], [关]
示例 2:
输入: n = 2, m = 1. 输出: 3 说明: 状态为: [开, 关], [关, 开], [关, 关]
示例 3:
输入: n = 3, m = 1. 输出: 4 说明: 状态为: [关, 开, 关], [开, 关, 开], [关, 关, 关], [关, 开, 开].
注意: n
和 m
都属于 [0, 1000].
代码:
package main
import "fmt"
func flipLights(n int, m int) int {
init := make([]int, n)
for i := range init {
init[i] = 1
}
ops := make([][2]int, 4)
ops[0] = [2]int{0, 1} // toggle all
ops[1] = [2]int{1, 2} // toggle even
ops[2] = [2]int{0, 2} // toggle odd
ops[3] = [2]int{2, 2} // toggle every 3
count := make(map[string]bool)
count[serialize(init)] = true
for i := 0; i < m; i++ {
for j, op := range ops {
if i == 0 && j == 0 {
// first operation: toggle all
for k := range init {
init[k] ^= op[0]
}
} else {
// other operations
for k := op[0]; k < n; k += op[1] {
init[k] ^= 1
}
}
count[serialize(init)] = true
}
}
return len(count)
}
func serialize(arr []int) string {
res := make([]byte, len(arr))
for i, v := range arr {
if v == 0 {
res[i] = '0'
} else {
res[i] = '1'
}
}
return string(res)
}
func main() {
fmt.Println(flipLights(1, 1))
fmt.Println(flipLights(2, 1))
fmt.Println(flipLights(3, 1))
}
输出:
2
3
4
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Rust每日一练 专栏(2023.5.16~)更新中... | |
Golang每日一练 专栏(2023.3.11~)更新中... | |
Python每日一练 专栏(2023.2.18~2023.5.18)暂停更 | |
C/C++每日一练 专栏(2023.2.18~2023.5.18)暂停更 | |
Java每日一练 专栏(2023.3.11~2023.5.18)暂停更 |