数组中唯一只出现一次的数字
思路
如果一个数字出现 3 次,那么它的二进制表示的每一位也出现三次,如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被 3 整除
cnt[32]
数组存储每一位 1 出现的次数- 遍历数组中所有数,将其二进制表示记录在
cnt
数组里 - 遍历
cnt
数组,根据cnt[i]
能否被 3 整除,推断出答案的二进制的第 i 位是 0 还是 1
复杂度分析
时间复杂度 O(32n)
,空间复杂度用到了长度为 32 的辅助数组,O(1)
代码
class Solution {
public:
int findNumberAppearingOnce(vector<int>& nums) {
int cnt[35];//cnt[i]记录二进制第i位1的个数
memset(cnt,0,sizeof cnt);
for(auto num:nums)
{
for (int i = 0; i < 32; i ++ )
if(num>>i&1) cnt[i]++;
}
int res=0;
for (int i = 0; i < 32; i ++ )
if(cnt[i]%3)//res二进制第i位为1
res+=1<<i;
return res;
}
};
有帮助的话可以点个赞,我会很开心的~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?