题目描述
给你个数字,其中有且仅有两个数字只出现了一次,其他所有数字都出现了两次,你需要找出这两个只出现了一次的数字。找到的两个数字请按从小到大的顺序输出。
对于所有数据,保证。
分析
^^
假定只出现一次的两个数由小到大分别为
那么,把所有数异或后得到^
假设该数的二进制表达
最高位的1一定来自,即所有数这一位是1的除外也是成对出现的。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n,num=0,a[maxn];
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]),num^=a[i];
int len=0;
while(num){
len++;
num>>=1;
}
int x=0,y=0;
for(int i=0;i<n;i++){
if(a[i]>>(len-1)&1)
y^=a[i];
else
x^=a[i];
}
printf("%d %d\n",x,y);
}