只出现一次的数字

如题所述

第1个回答  2022-07-24

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
1、使用异或方式(不使用额外空间)

A^0=A
A^A=0
A B c B C = A
上面等同于
var singleNumber = function(nums) {
return nums.reduce((a,b)=> a^b)
};
2、不考虑时间空间复杂度的话还可以使用更多的方法
比如:
1:使用集合存储数字,集合中不存在重复数字,集合中数字总和的2倍代表每个元素出现两次,减去原数组的和即是数组中只出现一次的数。

2:使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。

3:使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。

Map是一组键值对的结构,具有极快的查找速度。
方法:map.set() .has() .delete() .get()
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值覆盖。
Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。
方法:map.add() .has() .delete() .get()