关于异或操作和它的算法题

Posted chen-kh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于异或操作和它的算法题相关的知识,希望对你有一定的参考价值。

首先一篇文章推荐:感受异或的神奇,其中介绍了什么是异或,异或的定律:恒等律,归零律,交换律,结合律,以及一些常见用法和一个算法系列。非常好!

这个算法系列指的是:已知一个数组中除了1(2,3)个数字只出现一次,其余都出现2次,如何找到这1(2,3)个数。

这个算法系列的另一种扩展是:已知一个数组中除了1个数字只出现了一次,其余都出现了3次,如何找到这1个数。

解题思路类似:找到一种操作(命名为op),这种操作使得 a op a op a = 0,可以将op看成跟异或具有类似性质的操作。这样的话解题方法就变成了对于所有的元素,执行op操作得到的最终结果就是想要找的数字。

把异或看作是2进制加法不进位操作,则op可以理解为3进制加法不进位操作。但是这种操作不太容易实现,所以换一种思路。找到3个int值,作为32位位组,分别存储出现过1次的位,出现过2次的位,出现过3次的位,遍历数组,去掉出现3次的位,最终出现一次的位就是我们要找的数字。代码如下。

public static int singleNumber(int A[], int n) {
    int ones = 0;
    int twos = 0;
    int threes = 0;
    int i = 0;

    for (i = 0; i < n; i++) {
        twos |= ones & A[i];//得到出现两次的
        ones ^= A[i];//得到出现一次的
        threes = ones & twos;//出现3次的就是二者求交
        ones &= ~threes;//去掉出现三次的位
        twos &= ~threes;//去掉出现三次的位
    }
    return ones;
}

 

以上是关于关于异或操作和它的算法题的主要内容,如果未能解决你的问题,请参考以下文章

左神讲算法——异或的高级操作(两数交换+经典面试题)

左神讲算法——异或的高级操作(两数交换+经典面试题)

那些神题和它的改编消失的数字IIIIIIIV(全系列,干货满满)

算法复习——bitset(bzoj3687简单题)

关于区间异或的线段树

JAVA面试题和答案