算法第二十天 只出现一次的数字(简单题)

题目描述:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例描述:

题目分析:

题目告诉我们找出只出现了一次的那个数字即可

解题分析:

题目中给了我们,很多数字都出现了两次,只有一个没有出现两次,所以我首先想到的是暴力的求解,虽然这个的时间空间等等复杂度都很高,但这确实是一个很好的方法来解决这个问题,我采取的方法是,找到两个相同的数字,因为如果你找不相同你会发现很难找,找到两个相同的数字之后,直接删除这两个,数组的长度就减2了,不断循环,直到数组只有一个元素为止

var singleNumber = function(nums) {
    for(var i=0;i<nums.length;i++){
        for(var j=i+1;j<nums.length;j++){
            if(nums[i]  ==nums[j]){
                nums.splice(j,1)
                nums.splice(i,1)
                i=0,j=i
            }
        }
    }
    return nums
};

但是这样做,会有很大的时间和空间的开销,其实不是很建议这样做,毕竟这是算法题,所以有没有什么办法能够让他的复杂度降低呢?

答案是异或运算:

1. 归零律:        

 

2. 恒等律:        

 

3. 交换律: 

 

4. 结合律

 

只需要牢牢的记住这四个异或运算的规律就可以了,我们先随便找到一个数字,当第一次循环的时候,数字肯定是第一个数字,当第二个数字出现的时候,如果相等,他们的异或结果是零,如果不相等,将这两个数使用二进制异或之后得出结果,最终就能得到我们想要的结果

代码如下:

var singleNumber = function(nums) {
    let num =0
    for(var i=0;i<nums.length;i++){
        num ^= nums[i]
    }
    return num
};

这样一来,就解决了相应的问题,得出了想要的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值