题目描述
题干:
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。
找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:
输入:nums = [-1,0]
输出:[-1,0]
示例 3:
输入:nums = [0]
题解分析
返回只出现过一次的两个元素,而且还提示你能不能线性复杂度,所以第一个思路就是哈希表
当然这里题目设计的就很巧妙,为什么这里是两个唯一的数字,并且其他的数都是成对出现
如果熟悉位运算的同学就应该知道,一个数和自己的异或为0,所以该数组相互异或可想而知
就是两个唯一出现过一次的异或结果,根据这个规律大家可以自己尝试尝试怎么解决
正确代码
public int[] singleNumber(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
int[] ans = new int[2];
int index = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
ans[index++] = entry.getKey();
}
}
return ans;
}
总结
题目设计的果然很精妙,这里还拓展了一种Map的遍历方式:Entry,以后可以更优雅了
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,最高处见