LeetCode Hot 100 刷题指南:题目清单、答案笔记与三轮复习法 简介这是一份面向算法面试准备的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, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) with open(hot100_清单.md, w, encodingutf-8) as f: f.write(render_md(data)) print(已生成 hot100_清单.md共, len(data), 题)这个脚本做的事很简单把手工维护的 JSON 转成方便查看的 Markdown 表格。值得注意的参数是ensure_asciiFalse保证中文标题正常写入文件indent2让 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(pathhot100_local.json): with open(path, encodingutf-8) as f: return json.load(f) def pick_today(items, tag_weights, k3, 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, k3) 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(rootnotes): 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, k5): 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 道题只是时间问题。希望帮到你。本文还有配套的精品资源点击获取