各二进制位的 位运算规则相同 ,因此只需考虑一位即可。如下图所示,对于所有数字中的某二进制位 1 的个数,存在 3 种状态,即对 3 余数为 0, 1, 2 。
若输入二进制位 1 ,则状态按照以下顺序转换;
若输入二进制位 0 ,则状态不变。
画出真值表:
class Solution {
public int singleNumber(int[] nums) {
int ones = 0, twos = 0;
for(int num : nums){
ones = ones ^ num & ~twos;
twos = twos ^ num & ~ones;
}
return ones;
}
}
方法二:
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, m = 3;
for(int i = 0; i < 32; i++) {
res <<= 1;//返回的是无符号数所以先左移一位
res |= counts[31 - i] % m;//从后往前依次表示高位到低位,每一位都是0和1的个数%3去或,0 | 1 等于1,0 | 0 =0
}
return res;
}
}