劍指Offer-40.數組中只出現一次的數字(C++/Java)

題目:

一個整型數組裏除了兩個數字以外,其餘的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。數組

分析:

咱們知道,兩個相同的數字異或的結果等於0,因此利用這個性質將數組中全部的數字異或,求得的結果,就是兩個只出現一次數字異或的結果。並且這兩個數字異或的結果確定不爲0,或者說結果數字二進制表示必定有一位爲1,咱們以第一個爲1的位置做爲區分數組中數字的條件,這樣便能將兩個數字分到兩個數組中,再分別異或每個數組中的數字,最後的結果即是這兩個只出現了一次的數字。spa

程序:

C++code

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        if(data.size() == 0)
            return;
        int flag = data[0];
        for(int i = 1; i < data.size(); ++i){
            flag ^= data[i];
        }
        int d = 1;
        while((flag & d) == 0){
            d = d << 1;
        }
        *num1 = *num2 = 0;
        for(int i = 0; i < data.size(); ++i){
            if((data[i] & d) != 0){
                *num1 ^= data[i];
            }
            else{
                *num2 ^= data[i];
            }
        }
    }
};

Javablog

//num1,num2分別爲長度爲1的數組。傳出參數
//將num1[0],num2[0]設置爲返回結果
public class Solution {
    public void FindNumsAppearOnce(int [] array, int num1[] ,int num2[]) {
        if(array == null || array.length == 0)
            return;
        int flag = 0;
        for(int i : array)
            flag ^= i;
        int d = 1;
        while((flag & d) == 0) {
            d = d << 1;
        }
        for(int i : array) {
            if((i & d) == 0) {
                num1[0] ^= i;
            }
            else {
                num2[0] ^= i;
            }
        }
    }
}
相關文章
相關標籤/搜索