☰
LeetCode Hot 100 刷题指南:题目清单、答案笔记与三轮复习法
2026/10/9 2:40:15 网站建设 项目流程

简介:这是一份面向算法面试准备的LeetCode热题100题目与答案合集,以C++语言实现。资源为单个PDF文档,压缩包大小仅640KB,轻量易携带,方便在通勤或间隙时间翻阅。目前已有1645人学习下载,足见其内容对刷题群体的实用价值。PDF内收录了多道经典高频题,包括两数之和、两数相加、无重复字符的最长子串、寻找两个有序数组的中位数等,每题均完整呈现题目描述、输入输出示例与可直接运行的C++解法代码,并对哈希表优化、链表进位处理、滑动窗口等核心算法思路进行要点提示。读者既能对照参考答案自查代码细节,也能从复杂度标注中理解时间与空间权衡。整体内容紧凑,适合准备技术笔试面试的开发者用于考前集中复盘,也可作为日常刷题时的速查手册。

1. Hot 100「题目加答案」:先看清题单是什么,别急着找答案

LeetCode Hot 100 大概是刷题圈里被提到最多次的一份题单,但很多人搜「leetcode热题100,题目加答案」时,真正想要的不是那 100 道题的题目描述,而是一份「能跟着走完」的完整方案——哪些题、按什么顺序刷、答案怎么组织、刷完怎么不白刷。这份题单的价值不在「100」这个数字,而在它是平台从海量提交里筛出来的高频题,覆盖了面试里七八成的常规考点。

网上流传的 Hot 100 版本很多,有的带着题解链接,有的只是一个题号列表。直接把别人整理的答案背一遍,是最容易翻车的用法:答案是有上下文的,跳过了自己思考的那一步,合上文档照样写不出来。这篇文章不打算再给你一份「背诵版答案」,而是把一件更实际的事讲清楚:题目清单怎么维护、答案怎么攒成自己的资产、三轮刷题节奏怎么定,以及那些让人半途而废的坑到底在哪。

适合谁?准备面试但时间有限的开发者、刷过几十题但感觉没体系的初级工程师,还有想带新人刷题的技术组长。下面所有方案都按「一个人、一台电脑、每天 1 到 3 小时」的强度设计。

2. 把 Hot 100 题单变成自己的:题号、标签与一份可维护清单

2.1 Hot 100 的构成:为什么是这 100 道,它覆盖了什么

Hot 100 不是随机抽的 100 道题,它的入选逻辑跟平台提交行为强相关:被反复练习、在面试中高频出现的题目会留在榜单里。这意味着它的构成天然偏向「面试常客」——两数之和、无重复字符的最长子串、LRU 缓存、岛屿数量、合并区间这些题目几乎是各版本 Hot 100 的钉子户。

从标签分布看,数组、哈希表、双指针、滑动窗口、二叉树、动态规划是绝对主力,贪心、回溯、图论、堆、栈占的比例小一些。这个分布对一个准备面试的人来说其实很友好:不需要把算法导论啃完,先把这些高频标签下的常见套路吃透,就能覆盖大部分真实场景。

但有一点要提醒:Hot 100 的榜单会调整,老题可能下榜、新题会进来。你搜到的某份「2024 版 Hot 100」可能跟账号里现在看到的不完全一致。所以第一步不是收藏别人的图,而是以你账号里当前能看到的题单为准,建一份自己的本地清单——这同时也解决了另一个问题:刷到一半想追踪进度,不能每次都去网页里翻。

2.2 用脚本生成带状态的刷题清单,别用脑记

我一般会用一个 JSON 文件作为唯一数据源,把题号、标题、标签、难度、个人状态都存进去,然后用脚本把它渲染成 Markdown 表格。比起直接在表格文件里维护,JSON 的好处是可编程——后面不管是随机抽题、按标签统计进度,还是生成复习清单,都从这份数据出发。

import json # hot100_local.json:题号、标题、标签、难度、我的状态 # status 取值:todo(待刷)/ thinking(有思路)/ ac(已通过)/ review(待复习) data = [ {"id": 1, "title": "两数之和", "tags": ["数组", "哈希表"], "level": "Easy", "status": "ac"}, {"id": 2, "title": "两数相加", "tags": ["链表", "数学"], "level": "Medium", "status": "ac"}, {"id": 3, "title": "无重复字符的最长子串", "tags": ["哈希表", "滑动窗口"], "level": "Medium", "status": "review"}, # 剩下的 97 条按你账号里的实际题单补全 ] def render_md(items): lines = ["| 序号 | 题号 | 标题 | 标签 | 难度 | 状态 |", "| --- | --- | --- | --- | --- | --- |"] for i, it in enumerate(items, 1): tags = ",".join(it["tags"]) lines.append(f"| {i} | {it['id']} | {it['title']} | {tags} | {it['level']} | {it['status']} |") return "\n".join(lines) if __name__ == "__main__": with open("hot100_local.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) with open("hot100_清单.md", "w", encoding="utf-8") as f: f.write(render_md(data)) print("已生成 hot100_清单.md,共", len(data), "题")

这个脚本做的事很简单:把手工维护的 JSON 转成方便查看的 Markdown 表格。值得注意的参数是ensure_ascii=False,保证中文标题正常写入文件;indent=2让 JSON 可读。运行一次之后,日常维护只需要改 JSON 里的status字段,脚本可以反复执行。

有了这份清单,你就可以在刷题过程中随时回答三个问题:还剩多少题没做、哪些标签是自己的薄弱项、哪些题需要二刷。这就是「题目」部分的落地。接下来要解决的是「答案」——不是网上的题解合集,而是你自己的答案库。

3. 给这 100 题配一套「能带走的答案」:模板、目录与 Git 管理

3.1 什么才算「一份答案」:思路、代码、复杂度三件套

很多人整理答案时只存一段 AC 代码,过两个月回看,完全想不起来当时为什么这么写。我理解的「能带走的答案」必须包含三样东西:用自己话讲清的思路、一份能跑通的代码、时间空间复杂度分析。缺了思路的代码是死的,缺了复杂度分析的思路是没校准过的。

思路部分不要抄题解原文,哪怕你确实是看了题解才做出来的,也要合上题解、用自己的逻辑重新推一遍。这个「重新表达」的动作才是把别人的解法变成自己能力的关键。复杂度分析则是面试必问项,刷题时不练,面试时就会卡在「你这个解法为什么是 O(n)」这种问题上。

我当时整理答案时踩过一个坑:把题解高赞回答整段复制进笔记,看着很充实,但复习时完全进不了脑子。后来改成「先写思路、再贴自己的 AC 代码」,笔记才真正有了复习价值。答案不需要漂亮,需要真实反映你的思考过程。

3.2 答案仓库的目录结构与刷题模板,直接抄

目录结构按题号分段比按标签分更省心。原因很简单:一道题可能同时属于数组和哈希表,按标签分目录就会面临「文件放哪」的选择题,而按题号分段永远不会有歧义。标签信息已经在 JSON 清单里了,没必要在文件系统里再表达一遍。

hot100/ ├── hot100_local.json # 题单数据源 ├── hot100_清单.md # 生成的进度表 ├── notes/ # 所有题解笔记 │ ├── 001-050/ │ │ └── 001_two-sum.md │ └── 051-100/ └── code/ # 纯代码文件,按语言分 ├── python/ ├── java/ └── cpp/

每道题的笔记用同一个模板,复习时就不用重新适应排版。下面是我一直在用的模板,Markdown 格式直接复制就能用:

# [题号] [标题](难度 / 标签) ## 题目核心 (用自己的话复述题目,不抄原题描述,写出关键输入输出和边界条件) ## 思路 (先写朴素想法,再写卡在哪一步,最后写优化点是什么) (时间复杂度 O(?),空间复杂度 O(?)) ## AC 代码 (把通过测试的代码粘进来,语言标注 python,保留关键注释) ## 踩坑备注 (记录边界条件、写错的变量名、二刷需要重点看的地方)

模板每部分的顺序是有讲究的:先复述题目是为了强制理解,再写思路是为了锚定解法逻辑,最后贴代码作为「证据」。踩坑备注则留给未来的自己——二刷时直接看这一节就够,不用从头读完全部内容。

3.3 用 Git 管理答案库:刷题记录也是一笔资产

刷题笔记和代码值得用 Git 管起来,因为它解决了两个实际问题:一是误删或改坏后有后悔药,二是能看到自己的进步轨迹。每次完成一道题、或者重刷了一道旧题,就提交一次。

# 在 hot100/ 目录下初始化仓库 git init # 每次刷完一道题,提交对应的笔记和代码 git add notes/001-050/001_two-sum.md code/python/001_two-sum.py git commit -m "hot100: 001 两数之和 AC,哈希表一次遍历" # 二刷后更新笔记,再提交一次 git add notes/001-050/001_two-sum.md git commit -m "hot100: 001 二刷,补充空间换时间的思路对比"

提交信息里带上题号和动作(AC / 二刷 / 重写),后续想回顾「我这周刷了什么」时直接看日志就行。这个仓库不需要推送到任何远程平台,本地用就完全够。我在实际刷题时,这个仓库的 logs 就是我的周报素材——哪类题刷得多、哪类题一直没碰,一目了然。

到这里,「题目加答案」这个需求已经落地成了一份本地资产:JSON 管题单、笔记管思路、Git 管版本。但攒答案不是目的,把它刷穿才是。下一章讲具体的三轮刷法。

4. 照这份题单刷三轮:标签顺序、时间节奏与高频题型打法

4.1 三轮刷法:按标签、按依赖、按随机,每轮目标不一样

Hot 100 刷一遍就完事是最常见的浪费。我推荐三轮,不是重复劳动,而是每轮解决一个不同的问题。

第一轮按标签刷:把同标签的题集中做,目的是建立模式识别能力。连续做 5 道双指针题之后,你会自发地发现「哦,双指针就是利用有序性减少一层循环」。这种规律靠分散刷题很难总结出来。第二轮按依赖序刷:先从数组、链表、哈希表这些基础结构开始,再进入二叉树、回溯、动态规划,让前面的知识成为后面的工具。第三轮随机抽题:完全模拟面试状态,抽到哪题写哪题,题目之间没有提示,考察的是真正记住了多少。

每轮对同一道题的要求也不同:第一轮能 AC 就行,第二轮要能讲清楚思路和复杂度,第三轮要限时完成并写出干净代码。同一道题做三遍不是浪费时间,而是把「见过」变成「会写」再变成「能讲」。

4.2 每天刷多少、复习间隔怎么定:把计划做成参数

很多人的计划是「每天刷几道」,但没有定义「复习」。结果就是刷到第 50 题时,第 10 题的解法已经模糊了。我用的方案是「3 + 2」:每天 3 道新题加 2 道旧题复习。新题保证进度,旧题对抗遗忘。

复习间隔参考艾宾浩斯遗忘曲线的实际应用,我用的是 1-2-4-7-15 的间隔表,也就是新题 AC 后的第 1、2、4、7、15 天各复习一次。这五轮复习之后,一道题基本就进入长期记忆了。具体到每天的操作就是:打开清单,看今天的日期,把对应需要复习的题号捞出来,先默写思路、再比对笔记。

如果你嫌手动维护复习计划麻烦,可以用下面这个脚本从 JSON 清单里按标签权重抽今天的题目。它解决的是「今天到底刷什么」的选择困难:

import json import random # 从 hot100_local.json 里按标签权重抽取今天的题目 # tag_weights 越大,该标签的题越容易被抽到,用于强化薄弱项 def load_db(path="hot100_local.json"): with open(path, encoding="utf-8") as f: return json.load(f) def pick_today(items, tag_weights, k=3, exclude_ids=()): # 只从还没 AC 的题里抽 pool = [it for it in items if it["id"] not in exclude_ids and it["status"] != "ac"] weighted = [] for it in pool: # 一道题的权重 = 它所有标签的权重之和 w = sum(tag_weights.get(t, 1) for t in it["tags"]) weighted += [it] * w if not weighted: return [] return random.sample(weighted, min(k, len(weighted))) if __name__ == "__main__": # 示例:动态规划和二叉树是薄弱项,权重调高 weights = {"动态规划": 4, "二叉树": 3, "数组": 2, "哈希表": 2} problems = load_db() today = pick_today(problems, weights, k=3) for it in today: print(f"{it['id']} {it['title']} [{','.join(it['tags'])}]")

核心逻辑在pick_today:先把已 AC 的题过滤掉,再按标签权重把题目复制多份进候选池,权重越高的标签被抽中的概率越大。k控制每天新题数量,exclude_ids可以排除你暂时不想碰的题。跑一次大概十几行输出,但比每天翻题单纠结「做哪道」省下不少意志力。

4.3 高频标签实战:动态规划、双指针、二叉树的核心套路

Hot 100 里的动态规划题有一个共同特征:题目问的往往是「最大」「最小」「多少种」,而不是具体方案。识别到这个特征后,答题路径就固定了:先定义状态数组的含义,再写状态转移方程,最后处理初始值。这三个步骤里,状态定义是 90% 的难度所在。我见过很多人在 DP 题上卡住,不是不会写转移方程,而是状态定义就没想清楚。

双指针则出现在两类场景里:一类是有序数组上的相向移动(比如两数之和的变体),另一类是快慢指针解决链表环问题。它们的共同前提是「数据具有某种单调性或顺序性」,没有这个前提硬套双指针,是常见的误用。二叉树题的核心是遍历顺序——前序、中序、后序、层序,大部分二叉树题就是「在某种遍历过程中做一件事」。

这三类题型合起来占了 Hot 100 接近一半的比例。按标签集中刷的好处在这里体现得最明显:你会在连续几道题里反复看到同一个套路,这种「重复中的顿悟」比任何题解都有效。

5. 刷 Hot 100 的避坑清单:五个经典翻车现场与排查方法

5.1 看答案秒懂,合上答案写不出——被动输入的陷阱

现象:打开题解,觉得每一步都很合理,关上页面自己写,卡在第一行代码,不知道函数签名怎么写。

原因:看答案是一种被动输入,大脑会产生「我会了」的错觉,但实际没有建立从题目到解法的主动映射。题解里省略的思考过程——为什么从这里切入、为什么排除另一种做法——才是解题能力的核心,而看答案恰恰跳过了这部分。

解决:给自己定一条规矩:看完题解后必须合上,用自己的话把思路写在笔记模板的「思路」栏里,写完再动笔写代码。如果写不出来,说明没真懂,回去再看一遍,但这次看完要尝试「给一个完全没做过这题的人讲清楚」——这能把被动输入强行转成主动输出。

5.2 刷到第 50 题,前面全忘了——没有复习机制

现象:进度条到一半,回头做第 20 题的同类题,觉得似曾相识但解法模糊,只能翻笔记。

原因:刷题是输入新知识的过程,但大脑的默认行为是遗忘。没有复习计划的刷题,本质上是「只存不取」,记忆痕迹在几天内就会快速衰减。这不是你不够努力,是记忆规律使然。

解决:用 4.2 里的「3 + 2」节奏和 1-2-4-7-15 复习间隔。把复习当成刷题的一部分,而不是额外任务。每天那 2 道复习题不需要完整重写代码,默写思路、对照笔记、标记「掌握」或「需重刷」就够。我自己的经验是:坚持复习之后,刷到第 70 题时对前 30 题的记忆清晰度比之前不复习时提升了一个量级。

5.3 按题号顺序刷,思维在数组和二叉树之间反复横跳

现象:有人拿到题单就从第 1 题往后刷,第 1 题数组、第 2 题链表、第 3 题滑动窗口,每道题之间没有关联,刷了 30 题还是觉得没体系。

原因:题号顺序不是学习顺序。相邻题号的考点可能完全不同,这种随机切换让大脑无法归纳模式,相当于每次都在做陌生题,效率极低。

解决:按标签分组刷。第一轮把数组和哈希表的题全部做完,再做双指针和滑动窗口,然后是链表、二叉树、动态规划。每个标签内部,题目难度从 Easy 到 Medium 递进,让大脑在同一个思维模式下持续加深理解。等模式建立起来之后,再切换到下一个标签。

5.4 只收藏不整理,答案躺在收藏夹里吃灰

现象:看到好的题解,先点收藏或者存个链接,想着「以后看」,然后就没有然后了。题刷完了,收藏夹里存了上百个链接,一个也没打开过。

原因:收藏是一个零成本的行动,它给了你一种「我已经拥有这份知识」的安全感,但实际上知识和你的大脑之间没有任何连接。收藏行为本身不是问题,问题是没有「整理」这个动作把外部知识转成内部资产。

解决:每道题 AC 之后,当天完成笔记的整理,哪怕只是把思路粗暴地写三行也得写。核心原则是「当日事当日毕」,因为隔一天的记忆就已经开始模糊了。笔记不需要精美,能让你在一周后复习时想起当时的思考过程就合格。

5.5 只刷 Hot 100 不扩展,遇到变式就慌了

现象:Hot 100 刷得滚瓜烂熟,面试遇到一道「长得不太像」的题,完全没有思路,明明考点是一样的。

原因:Hot 100 是高频题型的最小集合,不是算法的全部。它覆盖了常见套路,但真实面试题往往会在 Hot 100 的基础上加一层包装——换个场景、改个限制条件、把两个考点缝合在一起。只刷题单不总结套路,就只掌握了「这道题」而不是「这类题」。

解决:在笔记模板的「踩坑备注」里专门写一行:这道题还能怎么变?增加一个限制条件怎么办?把两个标签的知识点合并起来能不能解?每道题花两分钟想这个扩展,比多做十道新题更有价值。Hot 100 的定位是「地基」而不是「天花板」,地基打牢之后,遇到变式的反应是「这是某某套路的变体」而不是「这题我没见过」。

6. 把每一题压缩成记忆卡片:一个 10 行脚本管理二刷复习

刷完三轮之后,最大的风险是「又忘了」。我的做法是把每道题的笔记压缩成一张记忆卡片,每天随机抽 5 张快速过一遍。这个习惯比重新刷题更省时间,而且能长期维持对题感的敏感度。

import os import random # 每天的复习卡片:从 notes/ 目录下随机抽 5 道题,逼自己先回忆再对笔记 def parse_notes(root="notes"): cards = [] for dirpath, _, filenames in os.walk(root): for fn in filenames: if fn.endswith(".md"): # 卡片只保留文件名(题号+题名),内容留给你回忆 cards.append(os.path.splitext(fn)[0]) return cards def daily_review(cards, k=5): random.shuffle(cards) for title in cards[:k]: print(f"== {title} ==") # 先不翻笔记,在脑子里过三件事:思路、复杂度、当时的坑 print("回忆:核心思路 / 时间复杂度 / 踩坑点") print() if __name__ == "__main__": daily_review(parse_notes())

脚本的逻辑很简单:递归扫描notes/目录下所有 Markdown 笔记,随机抽取 5 个文件名作为今天的复习卡片。关键是使用方式——看到卡片标题后,先不打开笔记,强迫自己在脑子里过一遍思路、复杂度和当时的踩坑点,过完之后再翻笔记对照。这个「先回忆再对照」的动作,就是主动回想,也是记忆效果最好的复习方式。

我现在的习惯是每天早上花 10 分钟做完这组回忆题,再开始当天的新题。持续一段时间后你会发现,那些二刷三刷过的题已经不需要翻笔记就能流畅讲出解法——这时候它们才真正成为你的能力,而不只是收藏夹里的一份「题目加答案」文档。

如果你也开始照着这份题单动手,建议第一天不要贪多,先把 JSON 清单建好、模板准备好、Git 仓库初始化完,然后只刷一道题走通整个流程。工具链顺了,剩下的 99 道题只是时间问题。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询