劍指Offer-陣列-(12)
阿新 • • 發佈:2018-12-08
知識點/資料結構:陣列
題目描述
一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。
思路
//異或運算的性質:任何一個數字異或它自己都是0.
//1:我們從頭到尾依次異或陣列中的每個數字,那麼最終的結果就是兩個只出現了一次的數字的異或的結果,
//因為其他數字卻出現了兩次,在異或構成中全部抵消了
//2:由於這兩個數字一定不一樣,那麼異或的記過一定不為0,就是說,在這個結果數字的二進位制表示中至少有一位為1.
//3:我們在結果中找到第一個為1的位的位置,記為第n位。
//4:現在我們以第n位是不是1為標準把原陣列分成兩個陣列,分開後的陣列中各自包含有一個出現一次的的數字
//5:在各自的陣列中全部做一次異或,便得到了所需要的結果。
//num1,num2分別為長度為1的陣列。傳出引數 //將num1[0],num2[0]設定為返回結果 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { if(array.length < 2) return ; int myxor = 0; int flag = 1; for(int i = 0 ; i < array.length; ++ i ) myxor ^= array[i]; while((myxor & flag) == 0) flag <<= 1; // num1[0] = myxor; //num2[0] = myxor; for(int i = 0; i < array.length; ++ i ){ if((flag & array[i]) == 0) num2[0]^= array[i]; else num1[0]^= array[i]; } } }