一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路详见剑指offer,这里值得注意的地方时位运算的操作。
如果检查一个int数的第n位是不是1,可以先把这个数右移n位,这样第n位就落到了最右端,这时候与1操作,如果不是1,那么与操作结果就是0.
int isBit(int x, int index){
return (x>>index)&1;
}
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int size = data.size();
if(size<2)
return;
int res = data[0];
for(int i = 1; i < size; i++){
res = res^data[i];
}
if(res == 0)
return;
int index = 0;
while((res&1) == 0){
res = res >> 1;
index++;
}
*num1 = *num2 = 0;
for(int x : data){
if(isBit(x,index))
*num1 ^= x;
else
*num2 ^= x;
}
}