1. 程式人生 > >關於異或操作和它的算法題

關於異或操作和它的算法題

出現一次 實現 enum blank href sin 結果 com for

首先一篇文章推薦:感受異或的神奇,其中介紹了什麽是異或,異或的定律:恒等律,歸零律,交換律,結合律,以及一些常見用法和一個算法系列。非常好!

這個算法系列指的是:已知一個數組中除了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; }

關於異或操作和它的算法題