題目描述:
一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
思路:採用異或的方法,相同數字異或後結果爲0,不同數字異或後結果爲1,所以將數組中所有數字異或後的結果就是兩個只出現一次的兩個數異或的結果(因爲相同的數字異或爲0,所有出現過兩次的數字異或後結果就爲0了,抵消了)。得到異或結果以後,找到二進制中最後一個爲1的下標記爲當前位,然後,對所有數字的二進制按照當前位進行劃分,當前位爲1的,劃分到num1中,當前位爲0的,劃分到num2中。則最終num1和num2就是兩個只出現一次的數字。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
if(data.empty())
return ;
int res=0;//用於統計所有數字異或後的結果
for(int i=0;i<data.size();i++){
res^=data[i];
}
int BitIndex=0;//查找從後面數第一個“1”
findBitIndex(res,BitIndex);
*num1=*num2=0;
for(int i=0;i<data.size();i++){
if(isBit(data[i],BitIndex))
*num1^=data[i];//異或所有BitIndex位爲1的數字
else
*num2^=data[i];//異或所有BitIndex位爲0的數字
}
}
void findBitIndex(int &res,int &BitIndex){
while(((res&1)==0)&&(BitIndex<8*sizeof(int))){//int型數據的位數長度
res=res>>1;
BitIndex++;
}
}
bool isBit(int x,int index){
x=x>>index;
return x&1;
}
};