网易首页 > 网易号 > 正文 申请入驻

2026-06-14:切换打开灯泡。用go语言,给定一个整数数组 bulbs,数组中每个元素都在 1 到 100 之间。共有 100 个电灯泡,编号从 ...

0
分享至

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:遍历灯泡操作数组,用哈希map记录每个灯泡切换次数的奇偶性

核心逻辑:灯泡初始全关,切换偶数次=最终关闭,切换奇数次=最终打开;使用异或^=1快速标记奇偶,1代表切换奇数次(亮),0代表偶数次(灭)。

  1. 1. 初始化空字典cnt,用于存储灯泡编号与切换奇偶标记;

  2. 2. 读取数组第一个元素10:

  • • 字典中无键10,cnt[10] = 0 ^ 1 = 1;

  • • 含义:10号灯泡切换1次,奇数,暂时亮起。
    当前字典:{10:1}

3. 读取数组第二个元素30:

  • • 字典中无键30,cnt[30] = 0 ^ 1 = 1;

  • • 含义:30号灯泡切换1次,奇数,暂时亮起。
    当前字典:{10:1, 30:1}

4. 读取数组第三个元素20:

  • • 字典中无键20,cnt[20] = 0 ^ 1 = 1;

  • • 含义:20号灯泡切换1次,奇数,暂时亮起。
    当前字典:{10:1, 30:1, 20:1}

5. 读取数组第四个元素10:

  • • 字典已有键10,对应值为1,cnt[10] = 1 ^ 1 = 0;

  • • 含义:10号灯泡累计切换2次,偶数,最终熄灭。
    遍历全部数组后最终字典:{10:0, 30:1, 20:1}

阶段2:筛选所有最终亮起的灯泡

遍历哈希字典里每一组(灯泡编号,标记值):

  1. 1. 键10,值0:标记不大于0,代表切换偶数次,灯泡关闭,舍弃;

  2. 2. 键30,值1:标记大于0,切换奇数次,灯泡打开,将30存入结果切片ans;

  3. 3. 键20,值1:标记大于0,切换奇数次,灯泡打开,将20存入结果切片ans;
    筛选完成后,未排序的ans切片内容:[30,20]

阶段3:对结果升序排序

调用排序函数对ans切片从小到大重排:
原切片[30,20]排序后变为[20,30]

阶段4:返回并打印结果

函数将排序完成的切片返回,主函数输出最终结果[20,30]

二、时间复杂度分析

设输入数组长度为n(题目约束 1 ≤ n ≤ 100),去重后不同灯泡数量最多为100(灯泡编号1~100)。

  1. 1. 第一次遍历输入数组:遍历n个元素,单次map读写O(1),总耗时 O(n);

  2. 2. 遍历哈希字典筛选亮灯:最多遍历100个键,固定常数 O(1);

  3. 3. 排序结果切片:最多100个元素,常数规模排序 O(1);
    整体时间复杂度:O(n)
    常数操作不影响量级,核心耗时仅为遍历输入数组。

三、额外空间复杂度分析

额外开辟的存储空间:

  1. 1. map字典cnt:最多存储100组键值对(灯泡编号上限100),固定常量空间;

  2. 2. 结果切片ans:最多存放100个亮灯编号,固定常量空间;
    所有额外空间不受输入数组长度n线性增长,存在固定上限。
    整体额外空间复杂度:O(1)

Go完整代码如下:

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)
}

Python完整代码如下:

# -*-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()

C++完整代码如下:

  




std::vector toggleLightBulbs(const std::vector& bulbs) {
std::map cnt;
for (int i : bulbs) {
cnt[i] ^= 1; // 使用异或运算切换0/1状态
}

std::vector 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 bulbs = {10, 30, 20, 10};
std::vector 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;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
缅北电诈回流人员自述被割肾的亲身经历:“那时候不要说一个肾了,锯条腿、锯条手我都愿意,只要能走”

缅北电诈回流人员自述被割肾的亲身经历:“那时候不要说一个肾了,锯条腿、锯条手我都愿意,只要能走”

政知新媒体
2026-10-05 10:12:24
男子借款375万元未还清便不幸离世,妻子儿女声明放弃继承遗产,拒还剩余借款及利息,被告上法庭,法院:放弃继承不等同免除法定职责

男子借款375万元未还清便不幸离世,妻子儿女声明放弃继承遗产,拒还剩余借款及利息,被告上法庭,法院:放弃继承不等同免除法定职责

扬子晚报
2026-10-05 10:36:58
余承东发微博忘删内部备注,回应:已改,谢谢大家提醒

余承东发微博忘删内部备注,回应:已改,谢谢大家提醒

南方都市报
2026-10-04 19:42:37
以媒称初步调查显示:拿斧头砍机长的副驾驶原计划杀死机长 并驾驶飞机撞向以色列摩天大楼

以媒称初步调查显示:拿斧头砍机长的副驾驶原计划杀死机长 并驾驶飞机撞向以色列摩天大楼

闪电新闻
2026-10-05 08:31:46
5万美元一个人!东南亚电诈园区明码标价,中国大学生成了新猎物

5万美元一个人!东南亚电诈园区明码标价,中国大学生成了新猎物

大眼妹妹
2026-10-04 20:06:30
63岁刘欢病逝,戳穿最残酷的医疗真相:治病的金钱上限,只有100万…

63岁刘欢病逝,戳穿最残酷的医疗真相:治病的金钱上限,只有100万…

犀利强哥
2026-10-05 06:58:57
2026年诺贝尔奖即将揭晓, 九位华人科学家被视为热门获奖人选

2026年诺贝尔奖即将揭晓, 九位华人科学家被视为热门获奖人选

界面新闻
2026-10-05 11:19:47
樊振东不再沉默!和陈梦领证结婚,退役选择一下说清楚

樊振东不再沉默!和陈梦领证结婚,退役选择一下说清楚

小蒋爱唠嗑
2026-10-05 08:02:50
好人没好报?蔡天凤案曝最无耻一幕!开水煮、轮流上、仅冰山一角

好人没好报?蔡天凤案曝最无耻一幕!开水煮、轮流上、仅冰山一角

青杉依旧啊啊
2026-10-05 10:25:32
蔡康永3600万粉丝微博清空,这是一场绿营精心设计的策反大戏!

蔡康永3600万粉丝微博清空,这是一场绿营精心设计的策反大戏!

李博世财经
2026-10-05 12:01:18
国庆假期荣昌机关食堂人气依旧火爆:有人提前两三小时赶到,有游客称人均花费仅十几元

国庆假期荣昌机关食堂人气依旧火爆:有人提前两三小时赶到,有游客称人均花费仅十几元

极目新闻
2026-10-04 20:10:06
3岁男童从10楼坠下被水果店雨棚接住,店主:换雨棚980元,男孩父亲转来1000元,自己退回20元,“如果宽裕一点,不会让他赔”

3岁男童从10楼坠下被水果店雨棚接住,店主:换雨棚980元,男孩父亲转来1000元,自己退回20元,“如果宽裕一点,不会让他赔”

晋江电视台
2026-10-04 18:44:50
民进党催不出投票率急了?郑丽文直言:“洋流”跟“韩流”差很多

民进党催不出投票率急了?郑丽文直言:“洋流”跟“韩流”差很多

海峡导报社
2026-10-05 14:38:03
鲸鱼在国外饭局拼命保菊花!

鲸鱼在国外饭局拼命保菊花!

八卦疯叔
2026-10-05 11:11:31
“顺风车司机提前收高速费,却故意拖到1日零点免费下高速”,乘客称100多公里花了5小时,哈啰平台客服回应

“顺风车司机提前收高速费,却故意拖到1日零点免费下高速”,乘客称100多公里花了5小时,哈啰平台客服回应

极目新闻
2026-10-05 12:20:16
零跑汽车紧急声明:已下线与蔡康永相关的全部内容,并保留追究法律责任的权利

零跑汽车紧急声明:已下线与蔡康永相关的全部内容,并保留追究法律责任的权利

都市快报橙柿互动
2026-10-05 00:27:48
被执行死刑的巫鸿明、白应苍出镜

被执行死刑的巫鸿明、白应苍出镜

极目新闻
2026-10-05 09:08:22
孙千一口黄牙坐在CELINE秀场头排,旁边人牙白得反光,她愣是没贴片

孙千一口黄牙坐在CELINE秀场头排,旁边人牙白得反光,她愣是没贴片

西楼知趣杂谈
2026-10-04 17:52:11
订单排到2027年!全球新“风口”来了

订单排到2027年!全球新“风口”来了

中国能源网
2026-10-04 09:24:07
熬了两年半,抖音7.5亿收购黄了

熬了两年半,抖音7.5亿收购黄了

蓝鲸新闻
2026-10-04 12:29:14
2026-10-05 16:48:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1496文章数 83关注度
往期回顾 全部

科技要闻

DeepSeek Harness国庆假期上新!

头条要闻

抓捕缅北"四大家族"重要成员过程披露 中方只用10分钟

头条要闻

抓捕缅北"四大家族"重要成员过程披露 中方只用10分钟

体育要闻

30天30队·热:扬尼斯、阿德巴约与克雷

娱乐要闻

蔡康永事件发酵!品牌火速切割

财经要闻

零跑声明切割!蔡康永两面人身份被抵制

汽车要闻

方程豹9月热销破4万 首款皮卡鲨鱼将于四季度上市

态度原创

艺术
教育
本地
家居
游戏

艺术要闻

第八届山西省油画作品展 油画选(一)

教育要闻

北京这所“三非”录取人数超清北?!顶流央企招聘生源校名单流出

本地新闻

中秋逛白塔寺,体验国医妙荟雅集

家居要闻

2026建博会(广州) 公装联探展交流活动

曝性感克莱尔回归《生化10》 香艳美人要当主角了

无障碍浏览 进入关怀版