1=0001 2=0010 3=0011 4=0100 5=0101
对整个数组进行异或就可以保留只出现一次的数字,例如:
4^3^2^1^4^3^5^1=2^5=(0010)^(0101)=01110111:根据倒数第一个1确定位置,本次倒数第一个数字是1,所以倒数第一个为1的为一组,为0的为一组
- 分成[ 1, 3, 5 ] [ 2, 4 ]
- 进行异或:3^1^3^5^1=5, 4^2^4=2,所以结果为2,5
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
if(data.empty()) return ;
int len = data.size(), yihuo = 0;
for(int i = 0; i < len; i++)
yihuo ^= data[i];
*num1 = *num2 = 0;
for(int i = 0; i < len; i++)
{
if(data[i] & yihuo ? false : true)
*num1 ^= data[i];
else
*num2 ^= data[i];
}
}
};