
求解代码
java
public int singleNumber(int[] nums) {
int ans = 0;
// 遍历int的每一个二进制位,i表示当前处理第i位(0是最低位,31是最高位)
for (int i = 0; i < 32; ++i) {
int total = 0; // 统计当前第i位的总1数
for (int num : nums) {
// 提取num的第i位值(0或1)并累加
// (num >> i):将num的第i位移到最低位
// & 1:保留最低位,消去其他位,得到第i位的实际值(0/1)
total += ((num >> i) & 1);
}
// 总1数%3≠0 → 唯一数的第i位是1
if (total % 3 != 0) {
// 将1写入ans的第i位:1<<i得到第i位为1、其余位为0的数,再和ans做或运算
ans |= (1 << i);
}
}
return ans;
}
小贴士
对于二进制的每一位(0~31 位),数组中所有数的该位上的 1,只会来自两部分:
出现 3 次的数的该位 1 ➕ 出现 1 次的数的该位 1。
由于 3 次的数的 1 相加后,总数一定是 3 的倍数,因此该位总 1 数 %3 的结果,就是唯一数在该位的取值(0 或 1)。