只出现一次的数字

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()

上一篇 下一篇

猜你喜欢

热点阅读