跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

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

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

星河入梦发布于 2026/3/25更新于 2026/9/348 浏览
面试题 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 = ; i <= nums.() + ; 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};
    }
};
1
size
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. 算法总结

更多推荐文章

查看全部
  • C++ 异常处理机制详解
  • Trae + Git 本地仓库离线管理指南
  • Stable Diffusion v1.5 风格迁移实战:照片转油画/水彩/像素风
  • 3661 可以被机器人摧毁的最大墙壁数目 - 离散化线段树二分查找
  • 非关系型数据库 Redis 简介及 Linux 环境下安装部署
  • Kiro 工具实测:前端代码生成验证与调整
  • OpenClaw AI Agent 框架本地部署全流程与安全建议
  • 前端自动化部署流程与最佳实践
  • Trae AI IDE 实战指南:从零开发 ChatBot 应用
  • 基于 DDPG 算法的电力市场博弈仿真与 Agent 建模研究
  • OpenClaw安全AI助理从零搭建实战教程
  • MiniCPM-V-2_6 数字孪生:工厂实景图识别与 IoT 数据关联可视化
  • 数据产品经理与AI产品经理的核心区别与联系
  • 基于 ESP32-S3 的蓝牙/有线双模智能家居键盘控制器设计详解
  • JavaScript 基础语法与 jQuery 快速入门
  • 本地知识库与 RAG 技术详解:大模型如何结合外部资料库
  • Windows 下安装 OpenClaw 并接入飞书机器人教程
  • OpenClaw 接入 QVeris:让 AI 助手具备实时数据查询能力
  • RAG 及数据增强型 LLM 应用的 4 个任务级别划分与应对策略
  • RV1106 基于 libdatachannel 的 4G WebRTC 实时视频传输方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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