關於異或操作和它的算法題
阿新 • • 發佈:2017-10-11
出現一次 實現 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; }
關於異或操作和它的算法題