题意:
一个数组中有两种数出现了奇数次, 其他数都出现了偶数次, 怎么找到这两个数。
解题思路:
因为可能有很多的数,所以不能开数组,就使用到了异或的运算,我还没有很懂就直接看代码吧。
程序代码:
//一个数组中有两种数出现了奇数次,
//其他数都出现了偶数次, 怎么找到这两个数
#include <iostream>
using namespace std;
int main()
{
// 10 ^ 100 = 110 10 & 10 = 10 100 & 10 = 110
int x[] = {1,3,5,1,3,5,2,4,2,4,123,1998,123,123};
int n = sizeof(x) / sizeof(*x);
//1.第一次异或,求得a ^ b
int ab = 0;
for(int i = 0;i < n;i++)
ab ^= x[i];
// cout << ab << endl;
//2.第二次异或
//1)首先找到a ^ b 的最右边的1,保留1开始的二进制位
//10110010 保留t = 10 11000 00111 + 1 = 01000
int t = ab & (~ab + 1);
// cout << t << endl; //10
//2)异或的时候,只要这个数与t按位与为0,异或起来就得到了
//a和b中的其中1个数a
int a = 0;
for(int i = 0;i < n;i++){
if((x[i] & t) == t){
// cout << i << " " << x[i] << endl;
a ^= x[i];
}
}
//3.第三次异或,b = a ^ b ^ a
int b = ab ^ a;
cout << a << " " << b << endl;
return 0;
}