【C++】每日一题 137 只出现一次的数字

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

cpp 复制代码
#include <vector>

int singleNumber(std::vector<int>& nums) {
    int ones = 0, twos = 0;
    for (int num : nums) {
        ones = (ones ^ num) & ~twos;
        twos = (twos ^ num) & ~ones;
    }
    return ones;
}

对于每一个整数,由于除了一个元素外,其余每个元素都出现了三次,我们可以考虑统计数组中所有元素的每一位的和并对 3 取模。结果应该是 3 的倍数加上单独出现的那个元素在该位上的值。

因此,我们可以遍历数组中所有元素的每一位,对每一位进行统计。因此定义两个变量 ones 和 twos,分别表示当前位上出现一次和两次的情况。如果某一位上出现了三次,则将 ones 和 twos 中对应的位清零。

最终,ones 中存储的就是只出现一次的那个元素。这样就能在线性时间复杂度和常数空间复杂度内找到只出现一次的元素。

这个算法的时间复杂度为 O(n),其中 n 是数组中元素的个数。算法需要对数组中的每个元素进行遍历,因此时间复杂度与数组的长度线性相关。

空间复杂度为 O(1),即常数级别的空间复杂度。算法只使用了常数个额外变量来存储 ones 和 twos,不随着输入规模的增加而变化。

相关推荐
汉克老师3 分钟前
GESP2026年3月认证C++五级( 第三部分编程题(2)找数)
c++·排序·双指针·二分算法·gesp5级·gesp五级
长安第一美人5 分钟前
AI辅助下的嵌入式UI系统设计与实践(二)[代码阅读理解]
c++·嵌入式硬件·ui·显示屏·工业应用
Theodore_102211 分钟前
深度学习(12)正则化线性回归中的偏差与方差调试
人工智能·深度学习·算法·机器学习·线性回归
比昨天多敲两行20 分钟前
C++ 多态
开发语言·c++
是娇娇公主~26 分钟前
C++ 多态机制与虚函数实现原理
c语言·c++
m0_5698814728 分钟前
跨语言调用C++接口
开发语言·c++·算法
老鼠只爱大米1 小时前
LeetCode经典算法面试题 #295:数据流的中位数(双堆法、有序列表、平衡树等多种实现方案详解)
算法·leetcode·优先队列··数据流·中位数·java 面试题
x_xbx1 小时前
LeetCode:215. 数组中的第K个最大元素
数据结构·算法·leetcode
黎阳之光1 小时前
AI数智筑防线 绿色科技启新篇——黎阳之光硬核技术赋能生态安全双升级
大数据·人工智能·算法·安全·数字孪生
2501_924952691 小时前
C++中的过滤器模式
开发语言·c++·算法