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

算法实战:位运算解决两数之和与缺失数字问题

位运算技巧在算法面试中应用广泛。通过两整数之和、只出现一次的数字及消失的两个数字三道例题,演示如何利用异或、按位与及比特位计数实现高效求解。所有方案均优化至线性时间复杂度且无需额外存储空间,适合掌握底层逻辑的开发者参考。

雾岛听风发布于 2026/3/24更新于 2026/5/56 浏览
算法实战:位运算解决两数之和与缺失数字问题

两整数之和

题目链接:

371. 两整数之和 - 力扣(LeetCode)

题目描述:

给定两个整数 a 和 b,不使用运算符 + 和 -,计算两整数之和。

题目示例:

输入:a = 1, b = 2 输出:3

输入:a = 2, b = 3 输出:5

解法(位运算):

算法思路

在计算机底层,加法本质上是二进制位的运算。我们可以利用位运算符来模拟加法过程:

  • 异或 ^:相当于【无进位加法】。例如 1 ^ 1 = 0,0 ^ 1 = 1,这与加法中不考虑进位的结果一致。
  • 按位与 &:能够定位到哪些位会产生进位。但进位需要左移一位才能加到高位上,所以是 (a & b) << 1。

核心逻辑是循环执行上述两步,直到没有进位为止。当进位为 0 时,当前的 a 即为最终结果。

C++ 算法代码

class Solution {
public:
    int getSum(int a, int b) {
        // 解法:位运算(^ 异或:无进位相加)
        while (b) {
            int x = a ^ b;          // 无进位和
            int y = (a & b) << 1;   // 进位值
            a = x;
            b = y;                  // 将进位作为下一轮的加数
        }
        return a;
    }
};

只出现一次的数字 II

题目链接:

137. 只出现一次的数字 II - 力扣(LeetCode)

题目描述:

给你一个整数数组 nums ,除某个元素仅出现一次外,其余每个元素都恰出现三次。请你找出并返回那个只出现了一次的元素。

题目示例:

输入:nums = [2,2,3,2] 输出:3

解法(比特位计数):

算法思路

既然其他数字都出现了三次,而目标数字只出现了一次,我们可以从二进制的角度思考。对于任意一个比特位(bit),如果统计数组中所有数字在该位上为 1 的总次数,那么这个总数对 3 取余,剩下的余数就是目标数字在该位上的值(0 或 1)。

通过遍历 32 个比特位,依次确定目标数字每一位的值,即可还原出整个数字。

C++ 算法代码

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        // 遍历整数的 32 个比特位
        for (int i = 0; i < 32; i++) {
            int sum = 0;
            // 统计所有数字在第 i 位上为 1 的次数
            for (int x : nums) {
                sum += ((x >> i) & 1);
            }
            // 模 3 后还原到 ret 对应的位置
            ret |= ((sum % 3) << i);
        }
        return ret;
    }
};

消失的两个数字

题目链接:

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

题目描述:

给定一个包含从 0 到 n+1 的整数数组,其中有两个数字消失了,请找出这两个消失的数字。

题目示例:

输入:nums = [1] 输出:[0, 2]

解法(位运算):

算法思路

这道题可以看作是'丢失的数字'和'只出现一次的数字 III'的结合体。

  1. 整体异或:将数组中的所有数与区间 [1, n+2] 的所有数进行异或。由于除了消失的两个数外,其他数都出现了两次(一次在数组,一次在区间),它们会相互抵消。最终得到的结果 ret 等于那两个消失数字的异或值(a ^ b)。
  2. 分组策略:因为 a 和 b 不同,它们的异或结果 ret 中至少有一位是 1。找到这个最右侧为 1 的比特位,根据这一位是 0 还是 1,可以将所有数字分成两组。
  3. 分别求解:消失的两个数必然分属不同的组。对每一组分别进行异或操作,即可分别得到 a 和 b。

C++ 算法代码

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int ret = 0;
        int a = 0;
        int b = 0;
        
        // 第一步:异或所有数组元素和区间元素
        for (int num : nums) {
            ret ^= num;
        }
        for (int i = 1; i <= nums.size() + 2; i++) {
            ret ^= i;
        }
        
        // 第二步:找到 ret 最右侧为 1 的比特位
        int x = 0;
        while (((ret >> x) & 1) == 0) {
            x++;
        }
        
        // 第三步:根据该位分组异或
        for (int num : nums) {
            if (((num >> x) & 1) == 0) {
                a ^= num;
            } else {
                b ^= num;
            }
        }
        for (int i = 1; i <= nums.size() + 2; i++) {
            if (((i >> x) & 1) == 0) {
                a ^= i;
            } else {
                b ^= i;
            }
        }
        
        return {a, b};
    }
};

以上三道题目展示了位运算在处理数值关系时的强大能力。掌握异或消去、进位模拟以及比特位统计的技巧,能帮助你在线性时间复杂度内解决许多看似复杂的数组问题。

目录

  1. 两整数之和
  2. 算法思路
  3. C++ 算法代码
  4. 只出现一次的数字 II
  5. 算法思路
  6. C++ 算法代码
  7. 消失的两个数字
  8. 算法思路
  9. C++ 算法代码
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • OpenClaw WebUI 空白页及 Not Found 问题排查与修复
  • Dify 接入企业微信群聊机器人实战指南
  • OpenHarmony 工具适配:tree 2.2.1 交叉编译与 HNP 打包
  • DeepSeek 爆发期,前端工程师的转型路径与核心价值
  • Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码
  • VS Code 中 Git 使用指南:从配置到协作
  • Java 中的 CAS 机制详解
  • Nano Banana AI 绘图中文模糊修复:Seedream 4.5 重渲染方案
  • 开源低代码平台 Microi 吾码:优势、安装与使用指南
  • IntelliJ IDEA AI 代码辅助插件 Windsurf 使用指南
  • 从 Java 到 Kotlin 语法平滑迁移指南
  • Chaterm:AI 驱动的云资源管理终端实战指南
  • 基于飞算 JavaAI 的在线图书借阅平台设计与实现
  • FastGPT 集成 MCP 协议构建工具增强型 AI Agent
  • Windows 下 MATLAB 与 C/C++ 混合编程:DLL 生成与调用
  • NestJS 接口响应 message 编写规范与 API 提示信息标准化
  • Elasticsearch 全文检索实战:匹配、短语、范围查询及条件删除
  • IPIDEA 网页抓取 API 实战:eBay 商品数据采集与 Python 接入
  • PyCharm 中提升 GitHub Copilot 代码建议准确性的实战技巧
  • OpenClaw + cpolar:打造本地 AI 智能体,实现外网远程访问与控制

相关免费在线工具

  • 加密/解密文本

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