描述
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
数据范围:数组长度 2≤n≤1000,数组中每个数的大小 0 <val≤1000000 要求:空间复杂度 O(1),时间复杂度 O(n)
提示:输出时按非降序排列。
示例1
输入:
[1,4,1,6]
返回值:
[4,6]
说明:
返回的结果中较小的数排在前面
示例2
输入:
[1,2,3,3,2,9]
返回值:
[1,9]
本题还是统计次数,因此可以通过map完成。但根据题目:数组里除了两个数字只出现一次,其他的数字都出现了两次,这时就可通过一个set来代替map来实现。
具体思路是:
注:用set而非map,主要优势是:set中最终只有2个数字,占用存储空间小(如有要用map,需要存储多个key-value键值对数据)。
如果文字描述的不太清楚,你可以参考视频的详细讲解:B站@好易学数据结构
核心代码如下:
func FindNumsAppearOnce(nums []int) []int {
res := make([]int, 0, 2)
// 1.定义一个哈希表(set),用map实现set的功能
hashTable := make(map[int]struct{})
//2.遍历数组元素,如果该元素在哈希表中存在,则直接删除;不存在则添加到哈希表中
for _, v := range nums {
if _, ok := hashTable[v]; ok {
delete(hashTable, v)
} else {
hashTable[v] = struct{}{}
}
}
//3.哈希表中只有2个元素,全部取出,放到结果集中
for key, _ := range hashTable {
res = append(res, key)
}
//4.进行非降序排序
if res[0] > res[1] {
res[0], res[1] = res[1], res[0]
}
return res
}
具体完整代码你可以参考下面视频的详细讲解。
本题首先想到的是通过map来实现,难点是如果想到通过set来对map实现方法进行改进。通过set,可以将数组出现两次的元素过滤掉(出现第一次,添加到set中;出现第二次,到set中删除元素)。最终set中只剩余2个只出现一次的元素。

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:
✅ 链表
✅ 二叉树
✅ 二分查找、排序
✅ 堆、栈、队列
✅ 回溯算法
✅ 哈希算法
✅ 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!
对于LeetCode数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:富与贵,是人之所欲也;不以其道得之,不处也。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。