1. 题目解析与异或运算基础
这道丢失数字的题目看似简单,却蕴含着位运算的精妙之处。题目给定一个包含n个数字的数组nums,其中数字取自范围[0, n],且每个数字唯一。由于数组本应包含n+1个数字,所以恰好缺失一个数字。我们的任务就是找出这个缺失的数字。
1.1 异或运算的核心特性
异或运算(XOR)是解决这个问题的关键,它有以下几个重要特性:
- 恒等性:a ^ 0 = a
- 自反性:a ^ a = 0
- 交换律和结合律:a ^ b ^ c = a ^ c ^ b = b ^ a ^ c
这些特性意味着:
- 任何数与0异或保持不变
- 相同数字异或会相互抵消
- 运算顺序不影响最终结果
1.2 解题思路的直观理解
想象你有一副完整的扑克牌(0到n),然后随机抽走一张。现在有两堆牌:
- 完整的一副(包含被抽走的那张)
- 被抽走一张后剩下的牌
如果我们把这两堆牌全部混在一起,那么:
- 成对出现的牌会互相抵消(因为a ^ a = 0)
- 唯一剩下的就是被抽走的那张牌(因为它只出现了一次)
这就是我们算法的核心思想。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现与详细解析
2.1 完整代码实现
cpp复制class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
int sum = 0;
// 计算0到n的异或结果
for(int i = 0; i <= n; i++) {
sum ^= i;
}
// 与数组元素依次异或
for(int num : nums) {
sum ^= num;
}
return sum;
}
};
2.2 代码分步解析
2.2.1 初始化阶段
cpp复制int n = nums.size();
int sum = 0;
n获取数组长度,因为缺
