一、题意先看懂
数组里:
- 只有一个数字出现 1 次
- 剩下所有数字都恰好出现 3 次 要求:O (n) 时间、O (1) 额外空间,找出那个唯一的数。
二、核心思路:按二进制每一位单独统计
把所有数字拆成 32 位二进制,对每一位分别统计 1 出现的总次数:
- 重复 3 次的数字:该位如果是 1,会贡献
3个 1; - 唯一 1 次的数字:该位如果是 1,会额外多
1个 1;
将每一位上的0和1的数据进行统计
会出现下面四种,将其%3的结果和我们所要求的该只出现一次的数据是一致得

逐位统计
遍历全部数字,统计当前 bit 上有多少个 1;
计数 %3,余数为 1 则给结果的这一位置 1。
cpp
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret=0;
for(int i=0;i<32;i++)
{
//统计1出现的个数
int total=0;
for(auto e:nums)
{
total+=(e>>i)&1;
}
//确定该32位位置的值是0还是1
if(total%3)
{
total=total%3;
ret=ret|(total<<i);
}
}
return ret;
}
};