Skip to content

Commit 5eef5e9

Browse files
committed
feat: add solutions to lc problem: No.0672
No.0672.Bulb Switcher II
1 parent 2d54b74 commit 5eef5e9

File tree

6 files changed

+276
-2
lines changed

6 files changed

+276
-2
lines changed

solution/0600-0699/0672.Bulb Switcher II/README.md

+103-1
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,124 @@
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
**方法一:位运算**
48+
49+
观察灯泡开关随按钮操作的变化规律,我们可以发现,位置 $i$ 与 $i+6$ 的灯泡,开关状态始终保持一致,因此,我们只需要考虑最多前 $n=6$ 个灯泡的开关状态。
50+
51+
另外,对于每个按钮,若操作偶数次,相当于没执行操作;若操作奇数次,相当于操作了 $1$ 次。同时,不同按钮操作的先后顺序,也不影响结果。
52+
53+
题目有 $4$ 个按钮,每个按钮有“操作偶数次”和“操作奇数次”两种状态,因此总共有 $2^4$ 种按钮状态。
54+
55+
二进制枚举按钮的状态 `mask`,若当前状态满足题目 `presses` 的限制,我们可以通过位运算,模拟操作对应按钮,最终得到灯泡的状态 $t$,去重后的 $t$ 的数量就是答案。
56+
57+
时空复杂度均为常数级别。
58+
4759
<!-- tabs:start -->
4860

4961
### **Python3**
5062

5163
<!-- 这里可写当前语言的特殊实现逻辑 -->
5264

5365
```python
54-
66+
class Solution:
67+
def flipLights(self, n: int, presses: int) -> int:
68+
ops = (0b111111, 0b010101, 0b101010, 0b100100)
69+
n = min(n, 6)
70+
vis = set()
71+
for mask in range(1 << 4):
72+
cnt = mask.bit_count()
73+
if cnt <= presses and cnt % 2 == presses % 2:
74+
t = 0
75+
for i, op in enumerate(ops):
76+
if (mask >> i) & 1:
77+
t ^= op
78+
t &= (1 << 6) - 1
79+
t >>= 6 - n
80+
vis.add(t)
81+
return len(vis)
5582
```
5683

5784
### **Java**
5885

5986
<!-- 这里可写当前语言的特殊实现逻辑 -->
6087

6188
```java
89+
class Solution {
90+
public int flipLights(int n, int presses) {
91+
int[] ops = new int[] {0b111111, 0b010101, 0b101010, 0b100100};
92+
Set<Integer> vis = new HashSet<>();
93+
n = Math.min(n, 6);
94+
for (int mask = 0; mask < 1 << 4; ++mask) {
95+
int cnt = Integer.bitCount(mask);
96+
if (cnt <= presses && cnt % 2 == presses % 2) {
97+
int t = 0;
98+
for (int i = 0; i < 4; ++i) {
99+
if (((mask >> i) & 1) == 1) {
100+
t ^= ops[i];
101+
}
102+
}
103+
t &= ((1 << 6) - 1);
104+
t >>= (6 - n);
105+
vis.add(t);
106+
}
107+
}
108+
return vis.size();
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
int flipLights(int n, int presses) {
119+
n = min(n, 6);
120+
vector<int> ops = {0b111111, 0b010101, 0b101010, 0b100100};
121+
unordered_set<int> vis;
122+
for (int mask = 0; mask < 1 << 4; ++mask) {
123+
int cnt = __builtin_popcount(mask);
124+
if (cnt > presses || cnt % 2 != presses % 2) continue;
125+
int t = 0;
126+
for (int i = 0; i < 4; ++i) {
127+
if (mask >> i & 1) {
128+
t ^= ops[i];
129+
}
130+
}
131+
t &= (1 << 6) - 1;
132+
t >>= (6 - n);
133+
vis.insert(t);
134+
}
135+
return vis.size();
136+
}
137+
};
138+
```
62139
140+
### **Go**
141+
142+
```go
143+
func flipLights(n int, presses int) int {
144+
if n > 6 {
145+
n = 6
146+
}
147+
ops := []int{0b111111, 0b010101, 0b101010, 0b100100}
148+
vis := map[int]bool{}
149+
for mask := 0; mask < 1<<4; mask++ {
150+
cnt := bits.OnesCount(uint(mask))
151+
if cnt <= presses && cnt%2 == presses%2 {
152+
t := 0
153+
for i, op := range ops {
154+
if mask>>i&1 == 1 {
155+
t ^= op
156+
}
157+
}
158+
t &= 1<<6 - 1
159+
t >>= (6 - n)
160+
vis[t] = true
161+
}
162+
}
163+
return len(vis)
164+
}
63165
```
64166

65167
### **...**

solution/0600-0699/0672.Bulb Switcher II/README_EN.md

+91-1
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,103 @@
6666
### **Python3**
6767

6868
```python
69-
69+
class Solution:
70+
def flipLights(self, n: int, presses: int) -> int:
71+
ops = (0b111111, 0b010101, 0b101010, 0b100100)
72+
n = min(n, 6)
73+
vis = set()
74+
for mask in range(1 << 4):
75+
cnt = mask.bit_count()
76+
if cnt <= presses and cnt % 2 == presses % 2:
77+
t = 0
78+
for i, op in enumerate(ops):
79+
if (mask >> i) & 1:
80+
t ^= op
81+
t &= (1 << 6) - 1
82+
t >>= 6 - n
83+
vis.add(t)
84+
return len(vis)
7085
```
7186

7287
### **Java**
7388

7489
```java
90+
class Solution {
91+
public int flipLights(int n, int presses) {
92+
int[] ops = new int[] {0b111111, 0b010101, 0b101010, 0b100100};
93+
Set<Integer> vis = new HashSet<>();
94+
n = Math.min(n, 6);
95+
for (int mask = 0; mask < 1 << 4; ++mask) {
96+
int cnt = Integer.bitCount(mask);
97+
if (cnt <= presses && cnt % 2 == presses % 2) {
98+
int t = 0;
99+
for (int i = 0; i < 4; ++i) {
100+
if (((mask >> i) & 1) == 1) {
101+
t ^= ops[i];
102+
}
103+
}
104+
t &= ((1 << 6) - 1);
105+
t >>= (6 - n);
106+
vis.add(t);
107+
}
108+
}
109+
return vis.size();
110+
}
111+
}
112+
```
113+
114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
int flipLights(int n, int presses) {
120+
n = min(n, 6);
121+
vector<int> ops = {0b111111, 0b010101, 0b101010, 0b100100};
122+
unordered_set<int> vis;
123+
for (int mask = 0; mask < 1 << 4; ++mask) {
124+
int cnt = __builtin_popcount(mask);
125+
if (cnt > presses || cnt % 2 != presses % 2) continue;
126+
int t = 0;
127+
for (int i = 0; i < 4; ++i) {
128+
if (mask >> i & 1) {
129+
t ^= ops[i];
130+
}
131+
}
132+
t &= (1 << 6) - 1;
133+
t >>= (6 - n);
134+
vis.insert(t);
135+
}
136+
return vis.size();
137+
}
138+
};
139+
```
75140
141+
### **Go**
142+
143+
```go
144+
func flipLights(n int, presses int) int {
145+
if n > 6 {
146+
n = 6
147+
}
148+
ops := []int{0b111111, 0b010101, 0b101010, 0b100100}
149+
vis := map[int]bool{}
150+
for mask := 0; mask < 1<<4; mask++ {
151+
cnt := bits.OnesCount(uint(mask))
152+
if cnt <= presses && cnt%2 == presses%2 {
153+
t := 0
154+
for i, op := range ops {
155+
if mask>>i&1 == 1 {
156+
t ^= op
157+
}
158+
}
159+
t &= 1<<6 - 1
160+
t >>= (6 - n)
161+
vis[t] = true
162+
}
163+
}
164+
return len(vis)
165+
}
76166
```
77167

78168
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int flipLights(int n, int presses) {
4+
n = min(n, 6);
5+
vector<int> ops = {0b111111, 0b010101, 0b101010, 0b100100};
6+
unordered_set<int> vis;
7+
for (int mask = 0; mask < 1 << 4; ++mask) {
8+
int cnt = __builtin_popcount(mask);
9+
if (cnt > presses || cnt % 2 != presses % 2) continue;
10+
int t = 0;
11+
for (int i = 0; i < 4; ++i) {
12+
if (mask >> i & 1) {
13+
t ^= ops[i];
14+
}
15+
}
16+
t &= (1 << 6) - 1;
17+
t >>= (6 - n);
18+
vis.insert(t);
19+
}
20+
return vis.size();
21+
}
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
func flipLights(n int, presses int) int {
2+
if n > 6 {
3+
n = 6
4+
}
5+
ops := []int{0b111111, 0b010101, 0b101010, 0b100100}
6+
vis := map[int]bool{}
7+
for mask := 0; mask < 1<<4; mask++ {
8+
cnt := bits.OnesCount(uint(mask))
9+
if cnt <= presses && cnt%2 == presses%2 {
10+
t := 0
11+
for i, op := range ops {
12+
if mask>>i&1 == 1 {
13+
t ^= op
14+
}
15+
}
16+
t &= 1<<6 - 1
17+
t >>= (6 - n)
18+
vis[t] = true
19+
}
20+
}
21+
return len(vis)
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int flipLights(int n, int presses) {
3+
int[] ops = new int[] {0b111111, 0b010101, 0b101010, 0b100100};
4+
Set<Integer> vis = new HashSet<>();
5+
n = Math.min(n, 6);
6+
for (int mask = 0; mask < 1 << 4; ++mask) {
7+
int cnt = Integer.bitCount(mask);
8+
if (cnt <= presses && cnt % 2 == presses % 2) {
9+
int t = 0;
10+
for (int i = 0; i < 4; ++i) {
11+
if (((mask >> i) & 1) == 1) {
12+
t ^= ops[i];
13+
}
14+
}
15+
t &= ((1 << 6) - 1);
16+
t >>= (6 - n);
17+
vis.add(t);
18+
}
19+
}
20+
return vis.size();
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def flipLights(self, n: int, presses: int) -> int:
3+
ops = (0b111111, 0b010101, 0b101010, 0b100100)
4+
n = min(n, 6)
5+
vis = set()
6+
for mask in range(1 << 4):
7+
cnt = mask.bit_count()
8+
if cnt <= presses and cnt % 2 == presses % 2:
9+
t = 0
10+
for i, op in enumerate(ops):
11+
if (mask >> i) & 1:
12+
t ^= op
13+
t &= (1 << 6) - 1
14+
t >>= 6 - n
15+
vis.add(t)
16+
return len(vis)

0 commit comments

Comments
 (0)