劍指offer40——數組中只出現一次的數字

題目描述

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

解答

先考慮只有一個只出現一次的數字情況。從頭到尾異或所有數字,相同的數字異或得0,必然只剩下只出現一個那個數字。
當有兩個時,從頭到尾異或後得到的是兩個不同的數字的異或後的結果。我們在結果數字中找到第一個結果爲一的位置,並依據這個將數組分爲兩個,這樣就可以運用上面的方法找到答案了。

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        if(data.size()<2)
            return;
        int length = data.size();
        int i;
        int resExclusiveOR = 0;
        for(i=0;i<length;i++) {
            resExclusiveOR = data[i]^resExclusiveOR;
        }
        unsigned int indexOf1 = findFirst1(resExclusiveOR);
        *num1 = *num2 = 0;
        for(i=0;i<length;i++) {
            if(isBit1(data[i],indexOf1))
                *num1 = *num1^data[i];
            else
                *num2 = *num2^data[i];
        }
    }

    unsigned int findFirst1(int resExclusive) {
        unsigned int index = 0;
        while(((resExclusive&1)==0)&&(index<8*sizeof(int))) {
            index++;
            resExclusive = resExclusive>>1;
        } 
        return index;
    }

    bool isBit1(int num,int index) {
        num = num>>index;
        return num&1;

    }
};
發佈了61 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章