题目链接
思路:
只有一个数字出现了一次,其余数字都出现了三次,那么对于每一个数的二进制表示,若这个数字出现了3次,则它二进制中的每一位也都出现了3次
int类型是32位,那么通过遍历数组中数字的每一位出现次数是否是3的倍数即可判断出 只出现一次的数字在这一位上是否是1,若这一位出现1的次数为3的倍数,则说明这一位上 只出现一次的数字 为0,否则为1
public int singleNumber(int[] nums) {
int result = 0;
for (int i = 0; i < 32; i++) {
// 每次循环向左移i为,用于记录每一位上1出现的次数
int mask = 1 << i;
int cnt = 0;
for (int j = 0; j < nums.length; j++) {
// 当前数字第i位上为1时,cnt++
if ((nums[j] & mask) != 0) {
cnt++;
}
}
// 若不为3的倍数,则说明只出现一次的数字在该位上为1
if (cnt % 3 != 0) {
result |= mask;
}
}
return result;
}
代码思路参考自:https://leetcode-cn.com/problems/single-number-ii/comments/104082