本题与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勿喷
本文探讨了解决SingleNumber问题的算法,利用二进制中1出现次数的规律,通过异或和与运算巧妙地找出只出现奇数次的数字。博客介绍了如何使用异或(~)和与(&)运算,并给出了完整的C++代码示例。
409

被折叠的 条评论
为什么被折叠?



