一、题目题意
给定一个包含 [0, n] 中 n 个整数的数组 nums,找出其中缺失的那个唯一数字。 示例:nums = [0,1,2,3,4,6],数组长度 n=6,完整区间应为 0~6,缺失数字是 5。
二、异或运算核心性质(解题关键)
- 自消律 :
x ^ x = 0,相同数字异或直接抵消为 0 - 归零律 :
x ^ 0 = x,数字和 0 异或等于自身 - 交换律、结合律 :
a ^ b ^ c = a ^ c ^ b,异或顺序不影响最终结果
三、解题思路(图文对应逻辑)
步骤拆解
- 数组内所有数字异或:
res1 = 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 6 - 完整区间
0~n全部数字异或:res2 = 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 - 把两次结果再做异或:
res1 ^ res2- 所有同时存在的数字(0、1、2、3、4、6)两两抵消变成 0
- 只剩只出现在完整区间、数组里缺失的数字
5,即为答案

cpp
class Solution {
public:
int missingNumber(vector<int>& nums) {
int ret=0;
for(auto e:nums)
ret^=e;
for(int i=0;i<nums.size()+1;i++)
ret^=i;
return ret;
}
};