美文网首页
只出现一次的数字

只出现一次的数字

作者: fan_8209 | 来源:发表于2021-04-18 12:15 被阅读0次

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
    示例 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()

    相关文章

      网友评论

          本文标题:只出现一次的数字

          本文链接:https://www.haomeiwen.com/subject/xqnxlltx.html