1. 异或运算的魔法:找出数组中唯一的孤独数字
在编程面试和算法竞赛中,有一类经典问题叫做"孤独数字"问题。给定一个非空整数数组,其中某个元素只出现一次,其余每个元素均出现两次,如何高效地找出那个孤独的数字?这道看似简单的问题背后,隐藏着位运算的精妙技巧。
我第一次遇到这个问题是在准备技术面试时,当时尝试了各种方法:使用哈希表统计次数、先排序再遍历比较...直到发现异或运算(XOR)的解法,才真正体会到算法的优雅。异或运算就像数字世界的消消乐,成对的数字会相互抵消,最后剩下的就是我们要找的答案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与暴力解法
2.1 问题描述
给定一个非空整数数组,其中某个元素只出现一次,其余每个元素均出现两次。例如:
- 输入:[2,2,1] → 输出:1
- 输入:[4,1,2,1,2] → 输出:4
2.2 直观解法:哈希表统计
最直接的思路是使用哈希表记录每个数字出现的次数:
python复制def singleNumber(nums):
count = {}
for num in nums:
if num in count:
count[num] += 1
else:
count[num] = 1
for num in count:
if count[num] == 1:
return num
这种方法时间复杂度O(n),空间复杂度O(n)。虽然可行,但需要额外的存储空间,不是最优解。
2.3 排序后比较法
另一种思路是先排序,然后比较相邻元素:
python复制def singleNumber(nums):
nums.sort()
for i in range(0, len(nums)-1, 2):
if nums[i] != nums[i+1]:
return nums[i]
return nums[-1] # 最后一个元素是孤独数字的情况
这种方法时间复杂度O(nlogn)(主要来自排序),空间复杂度取决于排序实现。虽然比哈希表节省空间,但时间复杂度更高。
3. 异或运算的巧妙解法
3.1 异或运算的特性
异或运算(XOR,符号^)有以下重要性质:
- 任何数和0异或,结果仍然是它自己:a ^ 0 = a
- 任何数和自身异或,结果是0:a ^ a = 0
- 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
3.2 异或解法原理
利用这些性质,我们可以将所有数字进行异或运算:
- 成对出现的
