Skip to content

🔍 找单身狗 - 寻找数组中的唯一数字 ​

📝 问题描述 ​

在一个整数数组中,除了某个元素只出现一次以外,其他每个元素都恰好出现两次。找出那个只出现一次的元素。

💡 解决方案 ​

使用异或运算(XOR)的巧妙解法 ​

js
/**
 * @param {number[]} nums - 输入数组
 * @return {number} - 返回只出现一次的数字
 */
function uniqueNumber(nums) {
    return nums.reduce((a, b) => a ^ b, 0);
}

// 测试用例
console.log(uniqueNumber([1, 2, 3, 0, 0, 3, 2, 1, 7]));  // 输出: 7

🔮 原理解析 ​

  1. 异或运算特性:

    • 任何数和0异或等于它本身:a ^ 0 = a
    • 任何数和自己异或等于0:a ^ a = 0
    • 异或运算满足交换律和结合律
  2. 为什么这个方法有效:

    • 当数组中的所有数字依次异或时
    • 相同的数字会两两抵消(因为 a ^ a = 0)
    • 最后只剩下单独出现的数字

🌰 更多示例 ​

js
// 更多测试用例
console.log(uniqueNumber([4,1,2,1,2]));  // 输出: 4
console.log(uniqueNumber([2,2,1]));      // 输出: 1

⚠️ 注意事项 ​

  1. 此方法仅适用于:

    • 数组中有且仅有一个数字出现一次
    • 其他数字均出现两次的情况
  2. 时间复杂度:O(n)

  3. 空间复杂度:O(1)

🚀 扩展思考 ​

如果需要找出数组中出现一次的两个数字,可以通过分组异或的方式解决。这将是一个很好的进阶练习题。

📚 相关知识 ​

js
// 位运算小贴士
console.log(5 ^ 5);    // 输出: 0
console.log(5 ^ 0);    // 输出: 5
console.log(5 ^ 3);    // 输出: 6