题目描述及解析:
位运算:
(1) 思路:
nums = [2,2,3,2] 二进制表示各位数:
2 = 0010
2 = 0010
3 = 0011
2 = 0010
各二进制为中1的个数 0041
对3求余 0011 -> 3
结论:可以发现三次出现的数,各个二进制位相加将是3的倍数
所以我们可以用一个数组储存各个二进制位出现1的个数,求余就好了。
(2)代码实现:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int hharray[32] = {0};
for(auto num:nums){
for(size_t i = 0;i<32;i++)
{
if(num & (1<<i))
{
hharray[i]++;
}
}
}
int val = 0;
for(int i = 0;i<32;i++)
{
if(hharray[i] % 3 != 0)
{
// 根据数组的下标判断要左移多少
// val |= (1<<i); // 或运算
val ^= (1<<i); // 异或也行
}
}
return val;
}
};
补充一点:
空间复杂度 O(1) : 数组 hharray长度恒为 32 ,占用常数大小的额外空间。