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

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

位运算在算法优化中常能带来空间与时间的双重提升。针对判断字符是否唯一的问题,利用位图思想可将空间复杂度降至 O(1),通过整数的比特位映射字符状态。对于丢失的数字,利用异或运算的自反性,将数组元素与完整序列进行异或,相同数值抵消后剩余即为缺失值。提供 C++ 实现方案及核心逻辑解析,帮助读者掌握位运算在面试中的高频应用技巧。

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

位运算基础前置知识

在深入具体题目之前,建议先熟悉几个常用的位运算公式。这些操作符是后续解题的基石,理解它们的特性能帮你快速找到突破口。

34. 判断字符是否唯一

题目描述: 给定一个字符串,判断其中所有字符是否都是唯一的。没有使用额外的数据结构(如哈希表)的情况下,如何实现?

思路解析: 这道题的核心在于空间优化。既然输入只包含小写字母,我们可以利用位图(Bit Map)的思想。一个 int 类型有 32 位,足够表示 26 个小写字母的状态。每一位对应一个字符,0 代表未出现,1 代表已出现。

这样做的好处是不需要额外的数组或集合,直接用整数变量充当哈希表,将空间复杂度降到了 O(1)。

代码实现:

class Solution {
public:
    bool isUnique(string astr) {
        // 如果字符串长度超过 26,根据鸽巢原理必然有重复字符
        if (astr.size() > 26) return false;
        
        int mask = 0; // 用整数的比特位记录字符状态
        for (char c : astr) {
            int val = c - 'a'; // 计算字符对应的偏移量
            // 检查该位是否已经是 1
            if ((mask >> val) & 1) return false;
            // 将该位置为 1
            mask |= (1 << val);
        }
        return true;
    }
};

注意: 实际运行时要注意边界条件,比如空字符串或长度超限的情况。这里直接返回 true 即可,原逻辑中的 -1 是笔误。

35. 丢失的数字

题目描述: 给定一个包含 [0, n] 中 n 个数的数组,找出缺失的那个数。

思路解析: 这道题非常适合用异或(XOR)运算来解决。异或有一个重要性质:相同的数异或结果为 0,任何数与 0 异或结果为其本身。

如果我们把数组中的所有元素,以及 [0, n] 范围内的所有数字全部放在一起异或,那么成对出现的数字都会抵消变成 0,最后剩下的那个非零值就是缺失的数字。这种方法既不需要额外空间,时间复杂度也是线性的。

代码实现:

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int ret = 0;
        // 先异或数组中的所有元素
        for (int n : nums) ret ^= n;
        // 再异或 0 到 n 的所有索引
        for (size_t i = 0; i <= nums.size(); ++i) ret ^= i;
        return ret;
    }
};

总结: 通过这两道题,我们可以看到位运算在处理特定约束下的数据问题时非常高效。位图适合做状态标记,而异或适合做消除和查找。掌握这些技巧,能在面试中快速给出最优解。

目录

  1. 位运算基础前置知识
  2. 34. 判断字符是否唯一
  3. 35. 丢失的数字
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • DeepSeek 各版本详解:特性、优缺点与选型指南
  • Video-LLaMa 本地部署流程与配置详解
  • AIGC 插画创作技术解析与代码实战
  • FastAPI:Python 高性能 Web 框架
  • WebAssembly 技术全景解析:核心机制与应用场景
  • SpringBoot 整合 Neo4j 图数据库实战
  • Vue3 开发实战:主流 AI 代码助手选择与 VSCode 配置
  • Vivado 入门教程:工程创建、仿真与烧录流程
  • MCP 插件配置指南:以 browser-tools-mcp 为例
  • 后仿真 SDF 反标常见 Warning 分析与处理指南
  • 深度神经网络的参数初始化方法
  • Java String 核心方法与使用技巧
  • 飞算 JavaAI 实战指南:安装、配置与核心功能解析
  • 双指针算法实战:三角形个数与多数之和
  • OpenClaw 快速部署指南:免环境配置十分钟跑通 AI 助理
  • 智能家居 AI 侦测方案:树莓派与云端协同
  • C++11 手写 Promise 实现及与 std::promise 对比
  • Java 日期差计算函数 Bug 导致游戏道具异常发放
  • PowerDesigner 12.5 安装与试用指南
  • OpenHarmony 下 Flutter 跨域难题:flutter_cors 实战与适配方案

相关免费在线工具

  • 加密/解密文本

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