首先一篇文章推薦:感覺異或的神奇,其中介紹了什麼是異或,異或的定律:恆等律,歸零律,交換律,結合律,以及一些常見用法和一個算法系列。很是好!算法
這個算法系列指的是:已知一個數組中除了1(2,3)個數字只出現一次,其他都出現2次,如何找到這1(2,3)個數。數組
這個算法系列的另外一種擴展是:已知一個數組中除了1個數字只出現了一次,其他都出現了3次,如何找到這1個數。spa
解題思路相似:找到一種操做(命名爲op),這種操做使得 a op a op a = 0,能夠將op當作跟異或具備相似性質的操做。這樣的話解題方法就變成了對於全部的元素,執行op操做獲得的最終結果就是想要找的數字。code
把異或看做是2進制加法不進位操做,則op能夠理解爲3進制加法不進位操做。可是這種操做不太容易實現,因此換一種思路。找到3個int值,做爲32位位組,分別存儲出現過1次的位,出現過2次的位,出現過3次的位,遍歷數組,去掉出現3次的位,最終出現一次的位就是咱們要找的數字。代碼以下。blog
1 public static int singleNumber(int A[], int n) { 2 int ones = 0; 3 int twos = 0; 4 int threes = 0; 5 int i = 0; 6 7 for (i = 0; i < n; i++) { 8 threes = twos & A[i];//目前出現三次的 9 twos ^= ones & A[i];//獲得出現兩次的 10 ones ^= A[i];//目前出現一次 11 ones &= ~threes;//去掉出現三次的位 12 twos &= ~threes;//去掉出現三次的位 13 } 14 return ones; 15 }