题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
//所有数字异或,最后得到的是两个只出现一次的数字异或的结果,从低位到高位
//找到第一异或为1的位,记下来,根据这个位,将原来的数组分做两部分,可解
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int mark_number=0,mark_index=0;
for(auto m:data)
{
mark_number^=m;
}
while(mark_number%2==0)
{
mark_index++;
mark_number=mark_number>>1;
}
int sum1=0,sum2=0;
for(auto m:data)
{
int k=m>>mark_index;
if(k%2==1)
{
sum1^=m;
}
else
{
sum2^=m;
}
}
*num1=sum1;
*num2=sum2;
}
};