1. 程式人生 > >劍指Offer-陣列-(12)

劍指Offer-陣列-(12)

知識點/資料結構:陣列

題目描述
一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。

思路

//異或運算的性質:任何一個數字異或它自己都是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];
        }
    }
}