有一个数组,某些数字出现了N次,只有一个出现了M次,求出该数字。
将所有的二进制位一一列出来,按照位进行对齐。如果要找到数据在该位上是0,那么其他所有的数把这个位上所有的0 1加起来之和,对N取模一定是等于0的,也就是一定能整除出现的次数。按照这个思路去判定要找的那个数,找出那个数据各个位是0还是1,最后转换为十进制数据就可以得到我们要的结果。注意保存目标数据位数的容器要超过数组中最大数据的二进制位数。
例如
链接:https://www.nowcoder.com/questionTerminal/1097ca585245418ea2efd0e8b4d9eb7a
来源:牛客网
class
Solution {
public
:
int
singleNumber(
int
A[],
int
n) {
int
bitnum[32]={0};
int
res=0;
for
(
int
i=0;i<32;i++){
for
(
int
j=0;j<n;j++){
bitnum[i]+=(A[j]>>i)&1;
}
res|=(bitnum[i]%3)<<i;
}
return
res;
}
};