位运算的典型题目,利用好两个相同的数字异或为0,任何数字和0异或都为原数字这两个性质即可。
思路:全部异或,以为1的位为标准,按照0/1将其分为两组,这两组中各包含一个只出现一次的值,其他出现两次的同一个数字一定被分到同一组。然后两组分别异或即可。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
if (data.size()<2) return;
int xorsum = data[0];
for(int i=1; i<data.size(); i++){
xorsum ^= data[i];
}
unsigned int IndexOfBit1 = FindFirstBitIs1(xorsum);
*num1 = *num2 = 0;
for(int j=0; j<data.size(); j++){
if(IsBit1(data[j], IndexOfBit1)){
*num1 ^= data[j];
}
else{
*num2 ^= data[j];
}
}
}
unsigned int FindFirstBitIs1 (int num) {
unsigned int index = 0;
while(((num&1)==0)&&(index<8*sizeof(int))){
num = num>>1;
index++;
}
return index;
}
bool IsBit1 (int num, int index){
num = num>>index;
if((num&1) == 0) return false;
return true;
}
};