一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
利用异或解决
1^1 = 0
1^0 = 1
0^0 = 0
x^x = 0
设数组中只出现一次的数分别为a, b;
记t=0;
t与数组中所有数异或结果为result = a^b;
又a!=b;
则result!=0;
设result的二进制表示的第inx位是1,则a和b的二进制表示的inx位上一个为1, 一个为0;
不妨设a的二进制表示的第inx位上为1,则b的二进制表示的第inx位上为0;
a与数组中所有二进制表示的第inx位上是1的数异或结果为a;
b与数组中所有二进制表示的第inx位上是0的数异或结果为b;
#include<bits/stdc++.h>
using namespace std;
bool judge(int x, int inx){
while(inx){
x/=2;
inx--;
}
return x%2==1;
}
void solve(vector<int> data, int *num1, int *num2){
int temp=0;
for(int i=0; i<data.size(); i++)
temp ^=data[i];
int cnt=0;
while(temp){
if(temp%2==1)
break;
cnt++;
temp/=2;
}
int temp1=0, temp2=0;
for(int i=0; i<data.size(); i++){
if(judge(data[i], cnt)) temp1^=data[i];
else temp2^=data[i];
}
*num1 = temp1;
*num2 = temp2;
}
int main(){
int n;
cin >> n;
vector<int> data;
for(int i=0; i<n; i++){
int x;
cin >> x;
data.push_back(x);
}
int a, b;
solve(data, &a, &b);
cout << "a: " << a << "b: " << b << endl;
return 0;
}
//2 4 3 6 3 2 5 5