🔍 找单身狗 - 寻找数组中的唯一数字
📝 问题描述
在一个整数数组中,除了某个元素只出现一次以外,其他每个元素都恰好出现两次。找出那个只出现一次的元素。
💡 解决方案
使用异或运算(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🔮 原理解析
异或运算特性:
- 任何数和0异或等于它本身:
a ^ 0 = a - 任何数和自己异或等于0:
a ^ a = 0 - 异或运算满足交换律和结合律
- 任何数和0异或等于它本身:
为什么这个方法有效:
- 当数组中的所有数字依次异或时
- 相同的数字会两两抵消(因为
a ^ a = 0) - 最后只剩下单独出现的数字
🌰 更多示例
js
// 更多测试用例
console.log(uniqueNumber([4,1,2,1,2])); // 输出: 4
console.log(uniqueNumber([2,2,1])); // 输出: 1⚠️ 注意事项
此方法仅适用于:
- 数组中有且仅有一个数字出现一次
- 其他数字均出现两次的情况
时间复杂度:O(n)
空间复杂度:O(1)
🚀 扩展思考
如果需要找出数组中出现一次的两个数字,可以通过分组异或的方式解决。这将是一个很好的进阶练习题。
📚 相关知识
js
// 位运算小贴士
console.log(5 ^ 5); // 输出: 0
console.log(5 ^ 0); // 输出: 5
console.log(5 ^ 3); // 输出: 6