498 字
2 分钟
只出现一次的数字

题目描述
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
解题思路
- 位运算核心:
- 利用异或(XOR)操作性质:
a ⊕ a = 0
,a ⊕ 0 = a
- 满足交换律:
a ⊕ b = b ⊕ a
- 利用异或(XOR)操作性质:
- 遍历处理:
- 初始化结果变量为0
- 遍历数组每个元素,与结果进行异或
- 结果推导:
- 出现两次的数字异或后相互抵消
- 最终结果即为只出现一次的数字
- 扩展应用:
- 可处理任意偶数次重复场景
关键洞察
- 异或特性利用:
- 相同元素异或归零
- 零与元素异或得元素本身
- 顺序无关性:
- 异或满足交换律和结合律
- 遍历顺序不影响最终结果
- 空间优化关键:
- 无需额外存储空间
- 常数级别空间复杂度
- 负数处理:
- 异或操作直接支持负数处理
- 二进制位运算无视符号
复杂度分析
指标 | 说明 |
---|---|
时间复杂度 | O(n):单次遍历数组 |
空间复杂度 | O(1):仅使用常数额外变量 |
代码实现
/** * @param {number[]} nums * @return {number} */var singleNumber = function (nums) { return nums.reduce((pre, cur) => pre ^ cur, 0);};
fn single_number(nums: Vec<i32>) -> i32 { nums.iter().fold(0, |acc, &x| acc ^ x)}
实际应用场景
- 数据校验:检测数据传输中的单比特错误`
- 加密算法:简单对称加密的密钥交换`
- 硬件设计: 奇偶校验位计算`
- 数据库查询:查找未配对的记录(如交易对账)`