題目描述
一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
解答
先考慮只有一個只出現一次的數字情況。從頭到尾異或所有數字,相同的數字異或得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;
}
};