
2026-06-14:切换打开灯泡。用go语言,给定一个整数数组 bulbs,数组中每个元素都在 1 到 100 之间。共有 100 个电灯泡,编号从 1 到 100,初始时全部处于关闭状态。
依次遍历数组 bulbs 的每个值 bulbs[i],对编号为 bulbs[i] 的灯泡执行切换操作:
遍历完成后,收集所有最终处于打开状态的灯泡编号,并按升序排列输出;如果最终没有任何灯泡打开,则返回空列表。
1 <= bulbs.length <= 100。
1 <= bulbs[i] <= 100。
输入: bulbs = [10,30,20,10]。
输出: [20,30]。
解释:
第 bulbs[0] = 10 个灯泡当前是关闭状态,将其打开。
第 bulbs[1] = 30 个灯泡当前是关闭状态,将其打开。
第 bulbs[2] = 20 个灯泡当前是关闭状态,将其打开。
第 bulbs[3] = 10 个灯泡当前是打开状态,将其关闭。
最终,第 20 个和第 30 个灯泡处于打开状态。
题目来自力扣3842。
核心逻辑:灯泡初始全关,切换偶数次=最终关闭,切换奇数次=最终打开;使用异或 ^=1 快速标记奇偶,1代表切换奇数次(亮),0代表偶数次(灭)。
cnt,用于存储灯泡编号与切换奇偶标记;10:cnt[10] = 0 ^ 1 = 1;{10:1}30:cnt[30] = 0 ^ 1 = 1;{10:1, 30:1}20:cnt[20] = 0 ^ 1 = 1;{10:1, 30:1, 20:1}10:cnt[10] = 1 ^ 1 = 0;{10:0, 30:1, 20:1}遍历哈希字典里每一组(灯泡编号,标记值):
[30,20]调用排序函数对ans切片从小到大重排:
原切片[30,20]排序后变为[20,30]
函数将排序完成的切片返回,主函数输出最终结果 [20,30]
设输入数组长度为 n(题目约束 1 ≤ n ≤ 100),去重后不同灯泡数量最多为 100(灯泡编号1~100)。
额外开辟的存储空间:
.
package main
import (
"fmt"
"slices"
)
func toggleLightBulbs(bulbs []int) (ans []int) {
cnt := map[int]int{}
for _, i := range bulbs {
cnt[i] ^= 1
}
for i, c := range cnt {
if c > 0 {
ans = append(ans, i)
}
}
slices.Sort(ans)
return
}
func main() {
bulbs := []int{10, 30, 20, 10}
result := toggleLightBulbs(bulbs)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
from collections import defaultdict
def toggle_light_bulbs(bulbs):
cnt = defaultdict(int)
for i in bulbs:
cnt[i] ^= 1 # 使用异或运算切换0/1状态
ans = [i for i, c in cnt.items() if c > 0]
ans.sort()
return ans
def main():
bulbs = [10, 30, 20, 10]
result = toggle_light_bulbs(bulbs)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
std::vector<int> toggleLightBulbs(const std::vector<int>& bulbs) {
std::map<int, int> cnt;
for (int i : bulbs) {
cnt[i] ^= 1; // 使用异或运算切换0/1状态
}
std::vector<int> ans;
for (const auto& pair : cnt) {
if (pair.second > 0) {
ans.push_back(pair.first);
}
}
// map已经按键排序,但为了与Go代码行为一致(Go中map无序需要排序),这里再次排序确保
// 实际上从map遍历已经是有序的,这行可以省略,但保留以明确意图
std::sort(ans.begin(), ans.end());
return ans;
}
int main() {
std::vector<int> bulbs = {10, 30, 20, 10};
std::vector<int> result = toggleLightBulbs(bulbs);
for (size_t i = 0; i < result.size(); ++i) {
std::cout << result[i];
if (i < result.size() - 1) {
std::cout << " ";
}
}
std::cout << std::endl;
return0;
}
