题目链接
题目:
分析:
- 对于只出现一次的数字, 他的任意一个bit位, 可能是0或1
- 对于其余出现3次的数字, 假设有3n个数, 那么他们的任意一个bit相加的和可能是3n个0或3n个1
- 那么对于数组中的全部数字的任意一个bit位之和共有三种情况:
- 3n个1 + 1 == 3n+1
- 3n个0 + 1 == 1
- 3n个1 + 0 == 3n
- 3n个0 + 0 == 0
- 此时将得到的结果%3
- 3n个1 + 1 == 3n+1 %3 = 1
- 3n个0 + 1 == 1 %3 = 1
- 3n个1 + 0 == 3n %3 = 0
- 3n个0 + 0 == 0 %3 = 0
- 可以观察到得到的结果即这个bit对应的值就是出现一次数字的bit的值
- 那么我们记录下这个bit位对应的值, 并且遍历全部bit位, 就能知道只出现一次的数字是谁了
代码:
class Solution {
public int singleNumber(int[] nums) {
int ret = 0;
for(int i = 0; i < 32; i++){
int sum = 0;
for(int x:nums){
if(((x>>i) & 1) == 1){
sum++;
}
}
sum %= 3;
if(sum == 1) ret |= 1 << i;
}
return ret;
}
}