算法:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。(异或符号的妙用)

 

异或的性质:

1、交换律

2、结合律(即(a^b)^c == a^(b^c))

3、对于任何数x,都有x^x=0,x^0=x

4、自反性 A XOR B XOR B = A xor  0 = A

算法:

class Solution {
    public int singleNumber(int[] nums) {
        int i,res=0;
        for(i=0;i<nums.length;i++){
            res=res^nums[i];
        }
        return res;
    }
}

解析过程:

这个算法中主要用到了异或的第三条性质,无论如何,res=res^nums[i]这条式子的计算结果都会以x^x^y或者x^y^x或者y^x^x这些形式出现,而按上面的性质,最终res的结果都是y,比如一组数据[4,1,2,1,2],从头开始,先是定义的res值与第一个元素异或:                                                                              0^4=4

  4接着与1异或,这里无法化简,接着与2异或,也无法化简,接着与1异或可以利用性质1和性质3消掉1,如下:

                                                                            (4^1)^2^1=4^2

同理最后有

                                                                             (4^2)^2=4

4就是结果了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值