题意
给你一个序列,然后这个序列的只有2个数出现奇数次,其余数都出现偶数次,找到那个出现奇数的数。
思路
如果不知道只有一个数为奇数次的情况可以点击
把所有的数全部异或出来,得到的ans就是这2个数的异或值,那么怎么找到这2个数,我们找到ans二进制中最先(从左往右)一个1的位置,然后在所有数中把这个二进制位为1的数全部异或出来得到ans1,为0的全部异或出来得到ans2,答案就是ans1,ans2。
那么为什么这样是可行的呢?首先2个数异或的值的二进制的位上为1,那么这2个数的二进制位在当前位上必然一个为0,一个为1,所以就把所有数以此来分为2部分,最后异或出来的值就是答案。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int man = 1e5+10;
int num[man],a[man],b[man];
int main(){
int t;
cin >> t;
while(t--){
int n;
int ans = 0;
cin >> n;
for(int i =1 ;i <= n;i++){
cin >> num[i];
ans ^= num[i];
}
int pos = 0;
for(int i = 0;i <=31;i++){
if((1<<i)&ans){//找到最低位 为 1 的位置
pos = i;
break;
}
}
pos = 1<<pos;
int ans1 = 0,ans2 = 0;
for(int i = 1;i <= n;i++){
if(pos&num[i]){//这个位置为1的为 ans1
ans1 ^= num[i];
}else{//为0的为ans2.
ans2 ^= num[i];
}
}
cout << min(ans1,ans2) <<' ' <<max(ans1,ans2) <<endl;
}
return 0;
}