题目描述
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
样例描述
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99]
输出:99
思路
位运算位数统计
- 只有一个数落单,其他是三个一组,如果把对应二进制位个数加起来应该是3的倍数,对3取模等于0,如果是1说明落单的对应二进制位是1。因此统计每个二进制位的个数,然后对3取模拼凑出落单的那个数
- 本质上是拼凑出落单数二进制中所有1的位置(0没有影响直接忽略),然后转化为十进制数
代码
class Solution {
public int singleNumber(int[] nums) {
int bits[] = new int[32];
for (int x: nums) {
for (int i = 0; i < 32; i ++ ) {
if (((x >> i) & 1) == 1) {
bits[i] ++;
}
}
}
int res = 0;
for (int i = 0; i < 32; i ++ ) {
if (bits[i] % 3 == 1) {
//拼凑到原数,用|=或者 求和都可以
// res |= (1 << i);
res += (1 << i);
}
}
return res;
}
}