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

算法实战:位运算解决字符唯一性与丢失数字问题

位运算实战通过两道经典题目解析核心技巧。第一题利用位图思想,用整数比特位标记字符出现情况,实现 O(1) 空间复杂度判断字符唯一性。第二题运用异或消消乐特性,将数组元素与完整序列异或找出缺失数字。代码示例展示 C++ 实现细节,适合快速掌握高效解题策略。

Eee_123发布于 2026/3/21更新于 2026/9/854 浏览
算法实战:位运算解决字符唯一性与丢失数字问题

位运算基础前置知识

在深入题目之前,先回顾几个常用的位运算公式。这些是后续解题的基石,建议结合图示理解。

位运算基础

上面提到的几个核心公式大家可以先记下来,推导过程不必死磕,重在应用。

34. 判断字符是否唯一

题目链接: 面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

题目描述: 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

题目示例: 题目示例

解法(位图的思想)

算法思路

这道题如果允许使用额外数据结构,用哈希表很容易解决。但为了追求极致空间效率,我们可以利用【位图】思想。

假设输入只包含小写字母,那么最多只有 26 种可能。一个 int 类型变量有 32 位,足够表示所有的小写字母状态。每一位代表一个字符:

  • 比特位为 0:表示该字符未出现过。
  • 比特位为 1:表示该字符已出现过。

这样,我们用一个整数就能充当哈希表,空间复杂度降为 O(1)。

C++ 算法代码
class Solution {
public:
    bool isUnique(string astr) {
        // 如果长度超过 26,根据鸽巢原理必有重复
        if (astr.size() > 26) return false;
        
        int m = 0;
        for (auto& s : astr) {
            // 检查对应位是否已被置 1
            if ((m >> (s - 'a')) & 1) return false;
            // 否则将该位置 1
            else m |= (1 << (s - 'a'));
        }
        return true;
    }
};

这里有个细节要注意:原逻辑中若发现重复直接返回 false,遍历结束则说明无重复,应返回 true。另外,由于题目通常限定为小写字母,提前判断长度大于 26 可以快速剪枝。

算法总结笔记

算法总结笔记

35. 丢失的数字

题目链接: 268. 丢失的数字 - 力扣(LeetCode)

题目描述: 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

题目示例: 题目示例

解法(位运算)

算法思路

设数组大小为 n,缺失前的完整序列应该是 [0, n]。现在数组中缺失了一个数。

如果我们把数组中的所有元素,以及 [0, n] 范围内的所有数字全部进行【异或】运算,会发生什么?

根据异或运算的性质:

  1. a ^ a = 0
  2. a ^ 0 = a

除了缺失的那个数,其他所有数字都会在'数组部分'和'完整序列部分'各出现一次,相互抵消变为 0。最终剩下的结果就是缺失的那个数字。

这种方法不需要额外空间,且时间复杂度仅为 O(n)。

C++ 算法代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int ret = 0;
        // 与数组中所有元素异或
        for (auto& n : nums) ret ^= n;
        // 与 0 到 n 所有数字异或
        for (size_t i = 0; i <= nums.size(); i++) ret ^= i;
        return ret;
    }
};

实际运行时会发现,这种写法比求和公式更稳健,完全避免了整数溢出的风险。

算法总结笔记

算法总结笔记

总结

这两道题是位运算的经典入门案例。第一题展示了如何用位图压缩空间,第二题展示了异或消去法的巧妙之处。掌握这些技巧,在处理底层数据或性能敏感场景时会有很大帮助。

目录

  1. 位运算基础前置知识
  2. 34. 判断字符是否唯一
  3. 解法(位图的思想)
  4. 算法思路
  5. C++ 算法代码
  6. 35. 丢失的数字
  7. 解法(位运算)
  8. 算法思路
  9. C++ 算法代码
  10. 总结

更多推荐文章

查看全部
  • Seata XA 模式:强一致性分布式事务的配置与权衡
  • 树中所有节点到其他节点的距离之和
  • Lit-LLaMA 大语言模型部署与微调指南
  • C++11 核心特性:列表初始化与右值引用移动语义详解
  • Bodymovin 开源动画转换工具跨平台集成方案
  • C 语言数据结构:单链表详解与实现
  • Mac mini 对比 NUC 与树莓派:OpenClaw 硬件平台选型分析
  • Java 零基础完整入门教程
  • AI 绘画商业变现模式与引流实操指南
  • VR 大空间项目内容规划与设计:2023-2026 市场实战复盘
  • 基于.NET 6 集成 GoView 低代码可视化大屏实战指南
  • 大模型技术教程:从基础入门到实战应用
  • Ubuntu 20.04 安装 Ollama 及 Open WebUI 本地部署 LLM 教程
  • Kiro 与 Cursor 深度对比:AI 编程助手体验
  • 使用回调接口将 AI 小助手接入企业微信群聊机器人
  • Rust 与 WebAssembly 实战:在浏览器与 Node.js 中运行高性能代码
  • 基于 Java 的电子发票 OFD 文件数字签名解析与验真
  • AI视频角色一致性怎么破?2026最新稳定方案大公开
  • C++ 从零实现 K-Means 聚类算法详解
  • 快代理 API 获取私密代理可用时长

相关免费在线工具

  • 加密/解密文本

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