1. 位运算基础与丢失数字问题
位运算在计算机科学中扮演着重要角色,特别是在处理二进制数据和优化算法性能时。丢失数字问题是一个经典的位运算应用场景,它要求我们在一个包含n个不同数字的数组中找出缺失的那个数字。这个问题看似简单,但通过位运算可以给出时间复杂度O(n)、空间复杂度O(1)的优雅解决方案。
我第一次遇到这个问题是在一次技术面试中,当时给出的数组是[3,0,1],要求找出缺失的数字2。最直观的解法可能是先排序再遍历,但这样时间复杂度就变成了O(nlogn)。后来了解到位运算的解法后,才发现原来可以如此高效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与核心思路
2.1 问题定义与数学基础
给定一个包含n个不同数字的数组,这些数字取自范围[0, n],找出数组中缺失的那个数字。例如,对于数组[3,0,1],缺失的数字是2;对于[9,6,4,2,3,5,7,0,1],缺失的数字是8。
这个问题背后的数学原理是异或(XOR)运算的几个重要性质:
- 任何数与0异或都是它本身:a ^ 0 = a
- 任何数与自身异或结果为0:a ^ a = 0
- 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
2.2 位运算解法原理
基于异或运算的性质,我们可以设计如下算法:
- 初始化一个变量result为0
- 遍历数组,将每个元素与result进行异或
- 再遍历0到n的所有数字,与result进行异或
- 最终result的值就是缺失的数字
这个方法的精妙之处在于,所有出现两次的数字(一次在数组中,一次在0-n范围内)都会相互抵消,只有缺失的数字会出现一次,最终保留在result中。
3. 详细实现与代码解析
3.1 基础实现代码
python复制def missingNumber(nums):
result = 0
for i, num in enumerate(nums):
result ^= num
result ^= i
result ^= len(nums)
return result
这段代码首先初始化result为0,然后遍历数组,对每个元素和其索引进行异或操作。最后再与数组长度
