很棒的一道题,利用了相同数异或为0的性质。把数分成两拨,逐拨求解。
这个题有个大坑坑了我很长时间,在判断中先算&算!=,不然会出错,亲测。
再所有条件中建议都稳健的加括号。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int len = data.size();
if(len < 2)
return ;
int sum = 0;
for(int i = 0; i < len; i++)
{
sum = sum ^ data[i];
}
int index = 1;
for(int i = 0; i < 32; i++)
{
if((index & sum) != 0)
break;
index = index << 1;
}
int sum1 = 0;
int sum2 = 0;
for(int i = 0; i < len; i++)
{
if((data[i] & index) != 0)
sum1 = sum1 ^ data[i];
else
sum2 = sum2 ^ data[i];
}
*num1 = sum1;
*num2 = sum2;
}
};