题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字
异或(XOR)运算:
- 相同的数 结果为 0
- 不同的数 结果为 1
- 0 和 其它数 异或 结果为 数本身
- 如果数组中只有一个数出现过一次,那么直接让0和所有数异或,结果即为所求的数;
- 因为题目中说有两个数,可以分两组,每个组中为 情况1
- 具体的划分方式就是,0和所有数异或的结果,为两个数的异或结果,由于这两个数不同,必定有1出现。二进制,将异或结果从右往左的数,第一次出现1为标志,将数据划分为两组。
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int one = 0;
int len = data.size();
for (int i=0;i<len;i++)
{
one = one ^ data[i];
}
int flag = 1;
while(flag)
{
if (flag&one)break;
flag = flag<<1;
}
int one1 =0;
int one2 = 0;
for (int i=0;i<len;i++)
{
if ((data[i]&flag)==flag)one1 = one1^data[i];
else one2 = one2^data[i];
}
*num1 = one1;
*num2 = one2;
}
};
int main()
{
Solution a;
int num1;
int num2;
int *c = &num1;
int *b = &num2;
vector<int>v{0,1,2,3,4,2,1,0};
a.FindNumsAppearOnce(v,c,b);
cout<<num1<<endl;
cout<<num2<<endl;
return 0;
}