实用指南:[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决

news/2025/11/20 12:39:06/文章来源:https://www.cnblogs.com/tlnshuju/p/19246645

实用指南:[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决

2025-11-20 12:35  tlnshuju  阅读(0)  评论(0)    收藏  举报
引言

欢迎来到本系列的第四篇!在前面的文章中,我们已经见识了哈希表在“查找”问题上的威力。今天,我们将面对一个看似简单,却能引出两种截然不同且都极为重要的解题思路的经典题目——LeetCode 136. 只出现一次的数字。

这道题是面试中的高频题,因为它像一个十字路口,既可以通往我们熟悉的数据结构之路(哈希表),又可以引领我们进入一个全新的、充满数学之美的领域——位运算

本文将带你一起:

  1. 用我们熟悉的哈希表方法,轻松解决这个问题。

  2. 深入探讨时间与空间复杂度的真正含义,澄清一些常见的误解。

  3. 揭开“位运算”的神秘面纱,领略其 O(1) 空间复杂度的极致魅力。


一、题目呈现

  • 题目编号:136. 只出现一次的数字

  • 题目难度:简单

  • 题目链接:136. 只出现一次的数字 - 力扣 (LeetCode)

  • 题目描述

    给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

  • 核心要求

    • 时间复杂度:线性,即 O(n)

    • 空间复杂度:常量,即 O(1)

  • 示例

    • 输入: nums = [4,1,2,1,2]

    • 输出: 4

二、我的思考:哈希表虽好,但空间超标

看到题目要求“找出唯一的元素”,我的第一反应依然是求助于我们的老朋友——哈希表。我们可以用哈希表来统计每个数字出现的次数,最后再找出那个出现次数为 1 的数字。

哈希表解法

这个思路非常直观,而且我们在之前的文章中已经熟练掌握了

#include 
#include 
class Solution_HashMap {
public:int singleNumber(std::vector& nums) {// 使用哈希表统计频率std::unordered_map counts;for (int num : nums) {counts[num]++;}// 遍历哈希表,找出频率为 1 的数字for (auto const& [num, count] : counts) {if (count == 1) {return num;}}return -1; // 理论上不会执行到}
};

复杂度分析:

  • 时间复杂度:我们遍历了一次 nums 来构建哈希表(O(n)),又遍历了一次哈希表来找结果(最坏情况下 O(n))。所以总时间复杂度是 O(n) + O(n) = O(n)符合要求

  • 空间复杂度:哈希表需要存储 n/2 + 1 个不同的数字。随着输入数组 n 的增大,哈希表的大小也会线性增大。因此,空间复杂度是 O(n)不符合 O(1) 的要求

虽然哈希表解法在时间上达标了,但在空间上却“超标”了。这迫使我们必须寻找一种全新的、不依赖额外存储空间的解题路径。

三、豁然开朗:位运算的魔法——异或 (XOR)

要实现 O(1) 的空间复杂度,意味着我们不能使用随 n 增长的额外数据结构。我们只能使用有限的几个变量。这听起来似乎不可能,但位运算让它变成了现实。

核心知识点:异或运算 ^

你可能还记得离散数学中的异或,编程中的位运算正是它的延伸。它有三个神奇的性质,是解决此题的关键:

  1. 任何数与 0 异或,结果是它本身: a ^ 0 = a

  2. 任何数与它自己异或,结果是 0: a ^ a = 0

  3. 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b

魔法发生了!
第三条性质告诉我们:将一堆数字全部异或在一起,那些成对出现的数字会因为 a ^ a = 0 而相互抵消,最终只剩下那个落单的数字!

一个具体的例子:[4, 1, 2, 1, 2]

让我们把数组中所有数字全部异或起来:
result = 4 ^ 1 ^ 2 ^ 1 ^ 2

根据交换律,我们可以重新排列:
result = 4 ^ (1 ^ 1) ^ (2 ^ 2)

根据性质2,1 ^ 1 = 0,2 ^ 2 = 0:
result = 4 ^ 0 ^ 0

根据性质1,4 ^ 0 = 4,4 ^ 0 = 4:
result = 4

我们不费吹灰之力就找到了答案!


四、C++ 最优代码与详解

有了位运算这个强大的武器,代码实现变得异常简洁。

#include 
#include  // 在某些写法中可能用到,但这里不需要
class Solution {
public:int singleNumber(std::vector& nums) {// 1.int accumulator = 0;// 2.for (int num : nums) {// 3.accumulator ^= num;}// 4.return accumulator;}
};

代码逐点解释
  1. int accumulator = 0;
    我们初始化一个“累加器”变量,值为 0。选择 0 是因为它是异或运算的单位元,不会影响第一次异或的结果(0 ^ 第一个元素 = 第一个元素)。

  2. for (int num : nums)
    我们使用范围 for 循环遍历 nums 数组中的每一个数字。

  3. accumulator ^= num;
    这是算法的核心。在每一次循环中,我们将累加器的当前值与数组中的当前元素 num 进行异或运算,并将结果存回累加器。a ^= b 是 a = a ^ b 的简写形式。

  4. return accumulator;
    当循环结束时,所有成对出现的数字都已相互抵消(变成了 0),累加器中剩下的就是那个唯一的、只出现了一次的数字。我们将其返回。


五、深度思考与答疑

问:如何理解“线性时间”和“常量空间”?

:这是你笔记中提出的一个非常深刻的问题!

  • 线性时间复杂度 O(n)

    • “线性”可以类比一次函数 y = kx。算法的执行时间(或步骤数)与输入数据的规模 n 成一个正比关系

    • 我们的代码只有一个 for 循环,它会遍历 n 个元素。如果数组长度翻倍,循环次数也大致翻倍。这就是典型的 O(n)。

    • 你对 n-a 的思考非常有趣:在大 O 表示法中,我们只关心增长的趋势。O(n),O(n-1),O(2n+5) 都被简化为 O(n),因为当 n 趋向于无穷大时,常数项和系数的影响都可以忽略不计。

  • 常量额外空间 O(1)

    • “常量”意味着算法使用的额外内存空间不随输入规模 n 的变化而变化

    • 在位运算解法中,我们只使用了一个额外的 int 变量 accumulator。无论输入数组 nums 有 10 个元素还是 1000 万个元素,我们都只需要这一个额外的变量。它的内存占用是恒定的。

    • 而哈希表解法中,如果数组有 1000 万个元素,哈希表也需要存储约 500 万个元素,内存占用随 n 线性增长,所以是 O(n) 空间。


六、总结与收获

  • 复杂度分析:位运算解法完美地满足了题目的苛刻要求。时间复杂度为 O(n),额外空间复杂度为 O(1)

  • 核心思想

    • 哈希表是解决频率统计问题的通用武器,但以空间换时间。

    • 位运算(异或) 在处理“成对出现”的问题时,提供了一种极致空间优化的“捷径”。

  • 关键技巧:熟练掌握异或运算的三个核心性质,是解锁许多位运算难题的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/970940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GYM106007D-Master of the Arena

GYM106007D-Master of the Arena 题目大意 有 \(n\) 个战士,给你一个 \(n*n\) 的矩阵,\(a_{ij}==1\) 表示 \(i\) 战士一定可以打败 \(j\) 战士; \(a_{ij}==0\) 表示 \(i\) 战士一定输给 \(j\) 战士; \(a_{ij}==?…

最牛Ai视频工具 Viggle 放大招了?开放终身会员,积分永不过期!

我没眼花吧,终身超级会员,积分永不过期,这是要卷上天的节奏啊。 应该是为满足众多创作者的请求,平台才决定开放此套餐,以满足低频且长期创作的朋友,不但价格非常优惠,重点是积分永不过期,随时可创作。 这套餐多…

Mac 从零开始配置 VS Code + Claude/Codex AI 协同开发环境教程 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[UOI2023] An Array and Partial Sums 题解(未完)

注意力惊人的注意到答案 \(\le 3\),证明考虑在原序列上或在取反序列上找到前缀和序列的最大最小值,然后向前向后各跑一次即可。 考虑继续挖掘性质。\(ans=0/1\) 情况显然,不过 \(ans=1\) 启示我们最后一次 \(2/3\) …

关于某个视频的一点点想法

写在前面1641 字 | 哲学 | 思考 | 辩证 | 讨论 | 观点 | 想法 | 爱情 | 主体性 | 自我 | 认知可能需要先观看本文所讨论的核心视频:怎么拥有判断爱情真伪的能力 [视频网站:哔哩哔哩] [UP 主:一川广隶] 视频标题:怎…

akm SharedWorker

debugger;;; // 主要功能模块 const infoCollectors = {networkInfo: function() {// 收集网络连接信息if (!(connection in navigator)) return null;const conn = navigator.connection;return [conn.effectiveType,…

20232416 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 1.1 实验要求(1)掌握metasploit、nmap的用法。(2)学习前期渗透的方法。(3)利用4个漏洞,实现对靶机的攻击。 1.2 学习内容(1)metasploit的用法:可以简单总结为“Search-Use-Show-Set-Exploit/run”。(2)四…

深入解析:【2B篇】阿里通义 Qwen3-VL 新增 2B、32B 两个模型尺寸,手机也能轻松运行

深入解析:【2B篇】阿里通义 Qwen3-VL 新增 2B、32B 两个模型尺寸,手机也能轻松运行pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

2025北京托福机构TOP5榜单!无老师/新通领衔,提分率90%+机构全解析

2025北京托福机构TOP5榜单!无老师/新通领衔,提分率90%+机构全解析随着留学申请竞争的加剧,托福成绩作为海外院校录取的核心指标之一,其备考效率与提分质量备受关注。北京作为留学教育资源聚集地,托福培训机构数量…

Why did Sanminism fail?

maybe the traditional Chinese should be Extincted. Jack London thinks Hieroglyphs should all die. So it was simplified. then it should be Chinese. it should be Asian, it should be European, it should o…

网络安全产品深度对比:Detectify与Halo Security的技术架构剖析

本文深入对比Detectify和Halo Security两款外部安全平台的技术架构,涵盖资产发现与分类、漏洞评估方法和用户体验三大核心领域,分析各自的自动化扫描引擎、API测试能力和工作流程设计差异。产品对比:Detectify vs. …

pyppeteer: 连接到已打开的chrome

一,chrome启动调试端口 $ google-chrome --remote-debugging-port=9222 --user-data-dir=/data/python/xianyu/userdataDevTools listening on ws://127.0.0.1:9222/devtools/browser/faddaa6e-98ec-444e-9710-9b7198…

深入解析:【开题答辩过程】以《重庆市社区养老服务小程序设计与实现》为例,不会开题答辩的可以进来看看

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年玻璃棉夹芯板直销厂家权威推荐榜单:聚氨酯夹芯板/两面企口夹芯板/金属幕墙夹芯板系统源头厂家精选

在工业建筑与绿色节能领域,一批掌握核心技术、具备全球视野的企业正推动着中国建筑围护系统向高端化、智能化方向革新。 玻璃棉夹芯板作为一种高性能的建筑材料,以其优异的保温隔热、防火隔音性能,在工业厂房、数据…

使用信号量实现父子父子进程交替运行的学习笔记

使用信号量实现父子父子进程交替运行的学习笔记 在学习进程同步机制时,信号量是一个非常重要的概念。相比于之前使用信号和全局变量实现进程同步的方式,信号量提供了更可靠、更灵活的同步机制。本文记录我使用 Syste…

基于MATLAB实现图像缺陷检测、清晰度评估及自动对焦功能

一、系统架构设计二、核心算法 1. 图像预处理 function preprocessed = preprocess(img)% 灰度化(心理学灰度公式)grayImg = rgb2gray(img);% 自适应去噪(非局部均值滤波)denoised = nlfilter(grayImg, [5 5], @(x…

托福提分认准这些!2025五大靠谱机构推荐,从基础到冲刺全覆盖

托福提分认准这些!2025五大靠谱机构推荐,从基础到冲刺全覆盖随着留学热潮的持续升温,托福成绩作为海外院校申请的核心指标,其重要性愈发凸显。优质的托福培训不仅能帮助学员高效掌握考试技巧,更能系统性提升语言能…

海南州一对一辅导机构靠谱推荐:2026最新教育机构榜! 持证师资精准发力

孩子成绩卡在中游难突破,报大班补习像“陪读”没效果,找一对一又怕遇到师资参差不齐、退费难的糟心事?在海南州,不管是共和县、贵德县、贵南县、同德县、兴海县,还是玛沁县、班玛县、甘德县、达日县、久治县、玛多…

2025 最新切割工程队推荐!混凝土 / 桥梁 / 支撑梁 / 无损切割等全场景工程队口碑排行榜,专业服务权威推荐

引言 在建筑改造与拆除领域,切割施工的安全性、精准度与环保性直接决定工程品质。当前行业存在技术水平不均、设备迭代滞后、安全管理缺失等痛点,导致需求方难以精准筛选靠谱服务团队。本次榜单由国际建筑切割技术协…

2025年淮南一对一家教机构推荐:五大辅导机构测评排行榜,综合实力全解析!

淮南不少家长为孩子课外补习犯愁:小学想打牢基础、初中要应对衔接、高中需重点培优,都希望找到靠谱的一对一辅导或家教,可挑选教育机构、筛选培训服务方的过程满是困扰。部分教育机构的师资信息遮遮掩掩,号称“资深…