力扣 268. 缺失数字 ✅ 【位运算(异或)最优解法】深度解析

一、核心结论先行

时间复杂度 O(n)、空间复杂度 O(1),是该题效率最高、最推荐的解法(优于求和法,无溢出风险)。

二、前置必备:异或运算的 3 个核心性质(解法根基)

异或运算(符号 ^)是二进制位运算,这 3 个性质是整个解法的灵魂,必须吃透:

✅ 性质 1(核心) :相同的两个数异或,结果一定是 0 → a ^ a = 0

✅ 性质 2(核心) :0 和任意数异或,结果等于这个数本身 → 0 ^ a = a

✅ 性质 3(辅助) :异或满足「交换律」和「结合律」→ a^b^c = a^c^b = (a^b)^c

三、题目背景与解题思路推导(力扣 268)

✅ 题目要求

给定一个包含 0, 1, 2, ..., n 中 恰好缺失一个数 的数组 nums(数组长度为 n),找出这个缺失的数字。

关键特征:完整序列是 0 ~ n(共 n+1 个数),nums 是该序列「丢失一个数」后剩下的 n 个数。

✅ 异或解法的核心思想

利用异或的特性:把「完整序列(0~n)」和「nums 数组」的所有数全部异或在一起,最终结果就是缺失的数字。

💡 原理推导:完整序列的数 + nums 数组的数,除了「缺失的数字」只出现1 次 ,其余所有数字都会出现2 次 → 成对的数异或后全部抵消为 0,最终 0 ^ 缺失数 = 缺失数。

java 复制代码
public int missingNumber(int[] nums) {
    int sum = 0;
    // 第一步:遍历 0 ~ nums.length(即完整序列 0~n),逐个异或到sum
    for (int i = 0; i <= nums.length; i++) {
        sum ^= i;
    }
    // 第二步:遍历nums数组(残缺序列),每个元素再逐个异或到sum
    for (int i : nums) {
        sum ^= i;
    }
    return sum; // 最终sum就是缺失的数字
}
代码执行本质(结合异或性质)
  1. 初始 sum = 0;
  2. 第一步异或:sum = 0 ^ 0 ^ 1 ^ 2 ^ ... ^ n;
  3. 第二步异或:sum = (0^0^1^2^...^n) ^ (nums[0]^nums[1]^...^nums[n-1]);
  4. 根据「交换律 + 结合律」,成对的数字会两两结合异或为 0,最终仅剩 缺失数。
✅ 举个实际例子(直观验证,一看就懂)

示例:nums = [3,0,1] → 数组长度 n=3,完整序列是 0,1,2,3,缺失数字是 2。

  • 第一步异或:sum = 0 ^ 0 ^ 1 ^ 2 ^ 3
  • 第二步异或:sum = (0^0^1^2^3) ^ (3^0^1)
  • 结合重组:sum = (0^0) ^ (1^1) ^ (3^3) ^ 2
  • 计算结果:sum = 0 ^ 0 ^ 0 ^ 2 = 2 → 恰好是缺失的数字 ✔️

五、该解法的【绝对优势】(对比最常见的「求和法」)

力扣 268 题还有一种求和法(公式:缺失数 = 0~n 和 - nums 数组和),代码如下:

java 复制代码
// 求和法(有缺陷)
public int missingNumber(int[] nums) {
    int n = nums.length;
    int total = n*(n+1)/2; // 0~n的等差数列求和公式
    int sum = 0;
    for(int num : nums) sum += num;
    return total - sum;
}
✅ 异或解法 VS 求和法(核心优势)
  1. 🥇 无数值溢出风险(最关键) 求和法中,当 n 很大时(比如 n=106),n*(n+1)/2 会超出 int 的取值范围,导致计算错误;而异或运算是按位操作,永远不会溢出。
  2. 🥈 时间 / 空间复杂度完全一致两种解法的时间复杂度都是 O(n),空间复杂度都是 O(1),效率持平。
  3. 🥉 运算更高效位运算(异或)是 CPU 底层直接支持的运算,比「加法 / 减法」的硬件执行效率更高。

✅ 结论:异或解法是本题的最优解,没有任何缺陷。

六、核心知识点总结(秒记,永久不忘记)

  1. 力扣 268 的最优解是「异或位运算解法 」,利用 a^a=0、0^a=a 两个核心性质;
  2. 解题关键:完整序列(0~n) + 残缺序列(nums) 全体异或,成对抵消后剩余值即为缺失数;
  3. 异或解法对比求和法,无溢出风险、运算更高效,是首选方案;
  4. 该思路可推广:只要是「找缺失 / 找重复数字」类题目,优先考虑异或解法。
相关推荐
Sirens.33 分钟前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕1 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng1 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆3 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的3 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙3 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11334 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY4 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录5 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室5 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法