只出现一次的数字
2021-04-18 本文已影响0人
fan_8209
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
1、使用异或方式(不使用额外空间)
var singleNumber = function(nums) {
let a=0
for(let num of nums){
a=a^num // a=a^2^2^1=1
}
return a
};
SingleNumber([2,2,1])
A^0=A
A^A=0
ABcBC = A
上面等同于
var singleNumber = function(nums) {
return nums.reduce((a,b)=> a^b)
};
2、不考虑时间空间复杂度的话还可以使用更多的方法
比如:
1:使用集合存储数字,集合中不存在重复数字,集合中数字总和的2倍代表每个元素出现两次,减去原数组的和即是数组中只出现一次的数。
var singleNumber = function(nums) {
let num = new Set(nums)
let sum2 = 0
for(let s of num){
sum2+=s
}
// let res = sum2*2-eval(nums.join('+'))
let res = sum2*2-nums.reduce((a,b)=>a+b)
if(res==0){
return false
}else{
return res
}
};
2:使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。
var singleNumber = function(nums) {
let hx = new Set()
for(let n of nums){
if(hx.has(n)){
hx.delete(n)
}else{
hx.add(n)
}
}
console.log(...hx)
return [...hx]
};
3:使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。
var singleNumber = function(nums) {
let hx = new Map()
let res = 0
for(let n of nums){
if(hx.has(n)){
hx.set(n, hx.get(n)+1)
}else{
hx.set(n,1)
}
}
// console.log(hx)
hx.forEach((value,key)=>{
// console.log(value,key)
if(value==1){
res = key
}
})
console.log(res)
return res
};
singleNumber([4,1,2,1,2])
Map是一组键值对的结构,具有极快的查找速度。
方法:map.set() .has() .delete() .get()
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值覆盖。
Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。
方法:map.add() .has() .delete() .get()