java异或运算符的应用-找出重复数字

异或运算的性质:

异或运算是基于二进制的位运算,采用符号XOR或者^来表示,运算规则是就与二进制,如果是同值取0、异值取1。

性质:

  1. 交换律 可以任意交换运算因子,结果不变。如:a ^ b = b ^ a
  2. 结合律 (a^b)^c=a^(a^c)
  3. 对于任何数x,都有x^x=0,x^0=x,同自己求异或运算为0,同0求异或运算结果为自己
  4. 自反性,A^B^B=A^0=A。这个性质可以用来求哪一个数为一个(异或运算最常见于多项式除法,不过它最重要的性质还是自反性:A XOR B XOR B = A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。)

前几天看到一个这样的题目,对于一个有多个数值的数组,只有一个是唯一的,其他都是成对的,怎样快速找到这个唯一值。在我没听过异或运算的时候,真是一脸懵,但是后来在看hashMap源码的时候看到了^ 异或运算符,搜了一下,才发现曾经看到的这道题的解题,顿时豁然开朗。

        int[] numarry = new int[]{1,2,3,2,3};
        int aim = numarry[0];
        for(int i = 1; i < 5; i++)
        {
            aim = aim ^ numarry[i];
        }
        System.out.println("最后:"+aim);

 关于上边的这个结果是什么,你只需要知道异或运算的特点就可以了,比如1,2,3,2,3 ,既然异或运算满足上边的交换规则,对于1^2^3^2^3 这样的异或运算,我们换一下位置(2^2)^(3^3)^1 ,通过两个相同的数进行异或运算得到0 ,那最终就会是0^0^1 ,最后会得到1 。
 

另外,还看到一个差不多的题,如下:
  1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
上边这个也可以用异或运算进行解题:
假设:1^2^3......^n.....^1000=T
而: 1^2^3......^n^n.....^1000 = T^n
我们已经知道T^T^n = 0^n = n这样的过程。
所以,我们对于上边的解题办法就有了:
首先对1到1000,这1000个数进行异或运算,然后再把上边的1001个数进行疑惑运算,最后,再对这两个结果进行异或运算,就会得到唯一的那个n。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值