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

题目描述#

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

解题思路#

  1. 位运算核心
    • 利用异或(XOR)操作性质:a ⊕ a = 0a ⊕ 0 = a
    • 满足交换律:a ⊕ b = b ⊕ a
  2. 遍历处理
    • 初始化结果变量为0
    • 遍历数组每个元素,与结果进行异或
  3. 结果推导
    • 出现两次的数字异或后相互抵消
    • 最终结果即为只出现一次的数字
  4. 扩展应用
    • 可处理任意偶数次重复场景

关键洞察#

  1. 异或特性利用
    • 相同元素异或归零
    • 零与元素异或得元素本身
  2. 顺序无关性
    • 异或满足交换律和结合律
    • 遍历顺序不影响最终结果
  3. 空间优化关键
    • 无需额外存储空间
    • 常数级别空间复杂度
  4. 负数处理
    • 异或操作直接支持负数处理
    • 二进制位运算无视符号

复杂度分析#

指标说明
时间复杂度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)
}

实际应用场景#

  1. 数据校验:检测数据传输中的单比特错误`
  2. 加密算法:简单对称加密的密钥交换`
  3. 硬件设计: 奇偶校验位计算`
  4. 数据库查询:查找未配对的记录(如交易对账)`

相似题目#

只出现一次的数字
https://website-truelovings-projects.vercel.app/posts/algorithms/只出现一次的数字/
作者
欢迎来到StarSky的网站!
发布于
2025-08-16
许可协议
CC BY-NC-SA 4.0