方法:
1, 如果数组中只有一个数字出现一次,则所有数字做^运算,最终结果就是该数字
2, 如果数组中有两个数字出现一次,假设为a,b,则所有数字做^运算,最终结果是a b 相^的结果,
此结果中的某一位肯定位1,且a中此位和b中此位必不相等,
且其他数字的此位必定存在双份,所以根据此位把原数组拆分成两个数组,则 a b 肯定分别在这两个数组中,按照1 中的方法求出即可
代码如下:
#include<iostream>
using namespace std;
int find_index(int a[], int len){
int tmp = 0;
int index = 0;
for(int i = 0; i < len; ++i){
tmp ^= a[i];
}
while(!(tmp & 1) && index < sizeof(int)*8){
++index;
tmp = tmp >> 1;
}
return index;
}
void find_2_single_nums(int a[], int len, int& num1, int& num2){
//全部^,查找二进制中为1的位
int index = find_index(a, len);
for(int i = 0; i < len; ++i){
if((a[i] >> index)&1){
num1 ^= a[i];
}else{
num2 ^= a[i];
}
}
}
int main(){
int a[10] = {1,1,2,2,3,3,4,4,99,109};
int num1 = 0;
int num2 = 0;
find_2_single_nums(a, 10, num1, num2);
cout << "find: "<< num1 << " "<< num2 << endl;
}