当前位置: 首页 > news >正文

5.2 位运算专题:LeetCode 268. 丢失的数字

1. 题目链接

LeetCode 268. 丢失的数字


2. 题目描述

给定一个包含 [0, n] 范围内 n 个不同整数的数组 nums(实际长度为 n),找出数组中缺失的那个数字。
示例

  • 输入:nums = [3,0,1] → 输出:2(缺失数字为 2
  • 输入:nums = [0,1] → 输出:2(缺失数字为 2

3. 示例分析
  1. 缺失中间值
    • nums = [0,1,3,4] → 缺失 2
  2. 缺失最大值
    • nums = [0,1,2] → 缺失 3(数组长度 n=3,范围为 [0,3])。
  3. 空数组
    • nums = [] → 缺失 0(题目保证 n ≥ 1,实际无需处理)。

4. 算法思路

核心思想异或运算的归零律与恒等律

  1. 异或性质
    • 归零律:a ^ a = 0
    • 恒等律:a ^ 0 = a
    • 交换律:a ^ b = b ^ a
  2. 问题转化
    • 假设完整数组为 [0,1,2,...,n],实际数组 nums 缺少其中一个数。
    • 对完整数组和实际数组进行异或运算,重复的数会被抵消,最终结果为缺失值。

实现步骤

  1. 遍历实际数组:将所有元素异或到结果 ret
  2. 遍历完整数组:将 [0,1,...,n] 中的每个数异或到 ret
  3. 最终结果ret 即为缺失的数字。

5. 边界条件与注意事项
  1. 输入数组有效性
    • 题目保证数组元素唯一且范围正确,无需额外处理重复或越界值。
  2. 缺失最大值的处理
    • 若缺失 n,第二个循环中 i 的范围为 0~n,仍能正确异或得到结果。
  3. 异或运算顺序无关性
    • 异或满足交换律,遍历顺序不影响最终结果。

6. 代码实现
class Solution 
{
public:
    int missingNumber(vector<int>& nums) 
    {
        int ret = 0;
        // 第一轮异或:处理实际数组
        for (int num : nums) ret ^= num;
        // 第二轮异或:处理完整数组 [0, 1, ..., n]
        for (int i = 0; i <= nums.size(); i++) ret ^= i;
        return ret;
    }
};

在这里插入图片描述


算法分步解析

  1. 初始化结果变量

    int ret = 0;
    
    • ret 初始为 0,因为 0 ^ a = a
  2. 第一轮异或遍历实际数组

    for (int num : nums) ret ^= num;
    
    • 假设实际数组为 [3,0,1],则 ret 结果为 3 ^ 0 ^ 1 = 2
  3. 第二轮异或遍历完整数组

    for (int i = 0; i <= nums.size(); i++) ret ^= i;
    
    • 完整数组为 [0,1,2,3],此时 ret 计算为 2 ^ 0 ^ 1 ^ 2 ^ 3 = 3
  4. 返回结果

    return ret;
    
    • 最终结果为 3,即缺失的数字。

与暴力枚举法的对比

方法时间复杂度空间复杂度核心思想
异或法O(n)O(1)利用异或抵消重复元素
哈希表法O(n)O(n)存储已出现元素,查找缺失值
数学求和法O(n)O(1)计算理论总和与实际和的差值
暴力枚举法O(n²)O(1)遍历检查每个数是否在数组中

异或法的优势
  1. 无额外空间:仅需常数空间,适合内存敏感场景。
  2. 避免溢出风险:相较于求和法,异或法无需处理大数溢出问题。
  3. 高效性:两次线性遍历即可解决问题。

总结

异或法通过巧妙的位运算,将时间复杂度控制在 O(n),同时避免使用额外空间,是解决“缺失数字”类问题的最优方案。其核心在于利用异或运算的数学性质,将重复元素抵消,最终定位缺失值。实际应用中,该方法还可扩展至其他需要“去重”或“找不同”的场景,例如只出现一次的数字等问题。

关键点

  • 异或运算的归零律和恒等律是算法的基础。
  • 两次遍历分别处理实际数组和完整数组,确保所有元素成对抵消。

相关文章:

  • Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow
  • 企业微信实现“关联外部选项“、“审批控件中的外部选项“
  • Four.meme是什么,一篇文章读懂
  • 信息的度量
  • 安宝特方案丨安宝特AR远程医疗方案如何重塑智慧医疗服务体系?
  • Jetson Orin NX使用 Ollama 本地部署 deepseek
  • 2025年上软考——【系统架构设计师】考前60天冲刺学习指南!!!
  • 内网渗透-端口映射
  • ngrep :网络嗅探的利器
  • 【RAG综述系列】之 RAG 相关背景和基本原理
  • 乐道突围特斯拉
  • 六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)
  • VRRP协议介绍及一些常见问题
  • C语言实现的冰墩墩
  • 搭建简易的rtsp服务器
  • Android Studio编译问题
  • HO与OH差异之Navigation
  • GitHub供应链攻击事件:Coinbase遭袭,218个仓库暴露,CI/CD密钥泄露
  • jangow靶机攻略
  • Vue.js 过滤器(Filters):简化文本格式化的利器
  • 长三角议事厅·周报|长三角游戏出海,关键在“生态输出”
  • 北汽蓝谷一季度净亏损9.5亿元,拟定增募资不超60亿元
  • 黄永年:说狄仁杰的奏毁淫祠
  • 宣称防老年痴呆的“原装进口”保健品McPee被指涉假,未获澳方销售批准
  • 从世界工厂走向全球创新中心,上海车展为何成为全球汽车行业风向标?
  • 伊朗港口爆炸最新情况:14死700多伤,大火延烧,调查困难