题目:
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
思路:
假设题目是这样的,一个整型数组里除了一个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
很简单,我们利用异或的性质就可以轻松的求出来了。回顾一下异或的特点:
- 0 ^ a = a
- a ^ a = 0
我们可以将所有的数字一异或,底数为0, 那么异或的结果就是数组中只出现一次的数字。
其实有两个只出现一次的数字,一开始也是用异或出来,结果就是这两个数的异或。考虑到两个不同的数,异或的结果肯定至少有一位是1的,那么我们可以从低到高进行分组,最后分别异或,最后分别得到的结果就是我们要求的结果。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
if(data.size()==0)
return;
int tmp = 0;
for(int i=0; i<data.size(); ++i){
tmp^=data[i];
}
int count = 0;//记录异或的最后一位为1
while(tmp){
if((tmp&0x1) == 1)
count++;
tmp = tmp>>1;
}
*num1 = 0;
*num2 = 0;
for(int i=0; i<data.size(); ++i){
if(isBit(data[i],count))
*num1^=data[i];
else
*num2^=data[i];
}
}
//检查某一位是否为1
bool isBit(int num, int index){
num = num>>index;
return (num&0x1)==1;
}
};