可视化图解算法69:数组中只出现一次的两个数字

1.题目

描述

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度 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]

2. 题解思路

本题还是统计次数,因此可以通过map完成。但根据题目:数组里除了两个数字只出现一次,其他的数字都出现了两次,这时就可通过一个set来代替map来实现。

具体思路是:

  1. 定义一个哈希表(set);

  2. 遍历数组元素,如果该元素在哈希表中存在,则直接删除;不存在则添加到哈希表中;

  3. 哈希表中只有2个元素,全部取出,放到结果集中;

  4. 进行非降序排序。

注:用set而非map,主要优势是:set中最终只有2个数字,占用存储空间小(如有要用map,需要存储多个key-value键值对数据)。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3.编码实现

核心代码如下:

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
}

具体完整代码你可以参考下面视频的详细讲解。

4.总结

本题首先想到的是通过map来实现,难点是如果想到通过set来对map实现方法进行改进。通过set,可以将数组出现两次的元素过滤掉(出现第一次,添加到set中;出现第二次,到set中删除元素)。最终set中只剩余2个只出现一次的元素。

分割线

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

  ✅   链表

  ✅   二叉树

  ✅   二分查找、排序

  ✅   堆、栈、队列

  ✅   回溯算法

  ✅   哈希算法

  ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于LeetCode数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:富与贵,是人之所欲也;不以其道得之,不处也。

posted @ 2025-11-22 09:49  好易学数据结构  阅读(7)  评论(0)    收藏  举报