1 题目描述
2 算法思路
思路:将所有数字,按位相加,然后对3取余,那么结果就是只出现了一次的数字。因为其它数字为1的位都可以被3整除。
接下来的重点就是如何在遍历时,计算位数: 有限状态机实在难以理解,因此选择了更简单的处理方式。有兴趣可以自己看
- 使用与运算,获取num的最后一位, n1 = num & i
- 无符号右移, num = num >>>1
- 利用int[] count = new int[32]进行统计
- 然后对count对3求余,再利用左移和或运算
- 得到res
3 代码
class Solution {
public int singleNumber(int[] nums) {
int[] counts = new int[32];
for(int num : nums){
for(int j = 0; j < 32 ;j++){
counts[j] += num & 1;
num >>>= 1;
}
}
int res = 0;
for(int i = 0;i < 32; i++){
res <<= 1;
res |= counts[31-i] % 3;
}
return res;
}
}
4 提交结果