在其余数都出现3次,找到恰好出现一次的那个数
分析:考虑一下答案,因为n-1个数中每个数都会出现3次,那么这些数对应的二进制为也就是出现3次
剩下那个是只出现一次,举个栗子 n=4 3 3 3 1
那么二进制表示
11
11
11
01
也就是说,找到二进制下%3意义下出现1次的那些二进制,模拟一下就ok 复杂度O(n*32)
不过可以考虑简化一下,增加一个变量模拟一下%3的过程,先只考虑一个二进制位,如何实现%3的+
0 0
1 0
0 1
0 0
大致就是表示,even=odd&1 odd^=1 p=~(even&odd) even&=p odd&=p
然后把这个结论扩展到32位就行了
#include<iostream>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+5;
int n,val;
int main(){
cin>>n;
int even=0,odd=0;
rep(i,1,n){
cin>>val;
even|=odd&val;
odd^=val;
int p=~(odd&even);
even&=p;
odd&=p;
}
cout<<odd<<endl;
return 0;
}

浙公网安备 33010602011771号