跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

面试题 17.19 消失的两个数字:位运算实战解析

面试题 17.19 寻找数组中缺失的两个数字。核心思路利用异或运算特性,将原数组与完整区间 [1, n+2] 进行异或,得到两个缺失数的异或值。通过提取该值的最低有效位(或遍历找到任意不同比特位),将数字分为两组分别异或,从而分离出两个缺失数。该方法时间复杂度 O(n),空间复杂度 O(1),是处理此类问题的经典位运算技巧。

星河入梦发布于 2026/3/25更新于 2026/5/75 浏览
面试题 17.19 消失的两个数字:位运算实战解析

面试题 17.19 消失的两个数字

题目链接:

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

题目描述:

题目描述

题目示例:

题目示例

解题思路

这道题本质上是 268. 丢失的数字 和 260. 只出现一次的数字 III 的结合体。

核心在于利用异或运算的性质:

  1. 相同的数异或为 0。
  2. 任何数与 0 异或为其本身。

我们将数组中的元素与区间 [1, n+2] 的所有整数一起异或。由于除了两个缺失的数字外,其他数字都出现了两次(一次在数组,一次在区间),它们会相互抵消。最终剩下的结果就是那两个缺失数字的异或值(记为 a ^ b)。

既然 a != b,那么 a ^ b 的结果中至少有一位是 1。我们可以根据这一位将所有的数字分为两组,每组包含一个缺失数字。再分别对两组进行异或,即可还原出 a 和 b。

C++ 实现方案

这里提供两种常见的位运算实现方式。

方法一:提取最低有效位

直接利用 x & (-x) 快速提取二进制中最右侧的 1。

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int temp = 0;
        // 数组元素异或
        for (auto& x : nums) temp ^= x;
        // 区间 [1, n+2] 异或
        for (int i = 1; i <= nums.size() + ; i++) temp ^= i;
        
        
         ls = temp & (-temp);
        
         a = , b = ;
        
         (& x : nums) {
             (x & ls) a ^= x;
             b ^= x;
        }
         ( i = ; i <= nums.() + ; i++) {
             (i & ls) a ^= i;
             b ^= i;
        }
         {a, b};
    }
};
2
// temp 现在是 a ^ b,提取最右边的 1
int
int
0
0
// 分组异或
for
auto
if
else
for
int
1
size
2
if
else
return
方法二:循环查找差异位

如果不熟悉位运算技巧,也可以循环移位找到第一个不同的比特位。

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int tmp = 0;
        for (auto x : nums) tmp ^= x;
        for (int i = 1; i <= nums.size() + 2; i++) tmp ^= i;
        
        // 找出 a, b 中比特位不同的那一位
        int diff = 0;
        while (true) {
            if (((tmp >> diff) & 1) == 1) break;
            else diff++;
        }
        
        int a = 0, b = 0;
        for (int x : nums)
            if (((x >> diff) & 1) == 1) b ^= x;
            else a ^= x;
        
        for (int i = 1; i <= nums.size() + 2; i++)
            if (((i >> diff) & 1) == 1) b ^= i;
            else a ^= i;
            
        return {a, b};
    }
};

算法总结

笔记展示

笔记展示


这种位运算解法避免了额外的哈希表开销,空间复杂度仅为 O(1),非常适合面试场景下的性能要求。理解异或消去律和分组思想,能解决很多看似复杂的计数问题。

目录

  1. 面试题 17.19 消失的两个数字
  2. 解题思路
  3. C++ 实现方案
  4. 方法一:提取最低有效位
  5. 方法二:循环查找差异位
  6. 算法总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型产品经理必备技能与成长路径指南
  • 宇树 G1 机器人开发入门:有线与无线连接配置
  • 大模型智能体(Agent)核心机制与开发指南
  • Mamba 模型环境配置指南:Windows 与 Linux 双平台部署依赖库
  • GitHub Copilot Pro 使用指南:模型选择与配额管理
  • Codex 核心概念详解:工程级 AI 编程智能体
  • Coze 智能体入门与构建指南
  • C 语言开发环境搭建指南(Windows/macOS/Linux)
  • AI 写作核心算法解析:从生成式模型到 Transformer
  • ComfyUI 插件安装失败排查:Git 配置与网络代理详解
  • Python PyQt6 实战:从零构建简易记事本
  • 因为淋过雨,所以想给前端人说点真心话
  • Spring Boot Web 后端开发核心注解详解
  • OpenClaw 部署实战:Minimax/DeepSeek 模型与飞书机器人集成
  • HarmonyOS 应用集成静默登录与端云一体功能实践
  • 使用 Trae 集成 Claude Code 进行 AI 编程开发
  • 宇树 G1 机器人 SDK2 开发指南:环境搭建至 Demo 测试
  • H5 本地存储:localStorage 与 sessionStorage 用法及区别
  • Trae 集成 Figma MCP 实现前端代码自动生成
  • VSCode Copilot 认证失败排查与修复实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online