本题与Single Numer I类似,不过不能用简简单单^
运算可以解决的了,因为都为出现奇数次。
但我们可以得出一个公式——每二进制位上1出现次数模3只有余1或0,且余1的Single Number相同位上也为1,余0的Single Number相同位上也为0。
于是我们用b,a表示1~3的2进制数,为01,10与11。
如何处理a?
首先,scanf("%d", &n);
我们将 n n n当做一位二进制数。
if(b == 0) {
if(n == 0) {
a = a;
}
else a = ~a;
}
else {
a = 0; //ab只有01、10和11
}
- 异或运算
x ^ 0 = x
,x ^ 1 = -x
引入异或运算。
if(b == 0) {
a ^= n;
}
else {
a = 0;
}
- 与运算
不说了,同为1为1,否则为0。
引入与运算。
a ^= n & ~b;
如何处理b?
同a。
b ^= n & ~a;
完整程序
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a = 0, b = 0, x;
scanf("%d", &n);
for(int i = 1; i <= n; i ++) {
scanf("%d", &x);
a = (a ^ x) & ~b;
b = (b ^ x) & ~a;
}
printf("%d", a);
return 0;
}
本蒟蒻第一篇博文,dalao勿喷