“hot 100”这三个字母,在程序员圈子里几乎已经成为算法面试准备阶段的必修符号。我第一次系统性刷它,是在准备校招的那个冬天,当时身边所有人都在聊这份题单:有人靠它拿了一线大厂offer,也有人刷到一半就放弃了。说实话,它的全称就是LeetCode上那份“高频热门题100道”,按真实面试中出现频率精选而成。无论你是应届生准备秋招,还是工作几年后想跳槽,又或者单纯想把数据结构和算法基础补扎实,这份题单都值得从第一道题开始认真对待。这篇文章我用自己的真实刷题经历,把Hot 100的拆解思路、三轮刷法、避坑经验一次讲透。
1. Hot 100到底是什么,为什么人人都刷它
1.1 一份题单的前世今生
很多人第一次听说Hot 100,是在牛客网的面经帖里,或者在GitHub上看到别人晒出的刷题仓库。它其实是LeetCode平台上一份名为“LeetCode Hot 100”的精选题目列表,按照全站用户的提交热度、面试考察频率自动生成。换句话说,它不是在讲知识点,而是在告诉你:“这些题,是真实面试里被反复考过的高频题。”
我当年第一次打开它的时候,它还是社区里口口相传的“高频题合集”,后来逐渐沉淀为刷题圈的事实标准。它最大的特点不是按难度排列,而是按“被考到的频率”排序。里面既有简单题,也有中等题,还有几道不折不扣的硬骨头,但整体难度分布很友好,是对“面试到底考什么”这个问题最直接的答案。
我一直觉得,Hot 100就像一份“算法考纲”。它不负责把所有冷门算法塞给你,而是把80%面试中会遇到的核心题型整整齐齐摆在面前:哈希表、链表、二叉树、动态规划、回溯、双指针、滑动窗口、贪心、二分……每个类别都有一定数量的题目覆盖。刷完它,不是让你成为算法竞赛选手,而是让你真实具备应对日常面试的底气和手感。
1.2 为什么是100道,而不是50或200道
这里有个非常现实的原因:人的记忆容量和备考周期是有限的。正常上班或者上学的情况下,每天能挤出的刷题时间不会太多。我自己的经验是,每天两小时左右,一题认认真真吃透需要四十分钟到一小时,那么100道题按两三轮刷下来,刚好是两到三个月的周期,匹配一个标准的求职备战节奏。
如果只刷50道,覆盖面会有明显缺口。算法面试的题型分布其实挺稳定,但50道题很难把树、图、动态规划、回溯这些大块全部覆盖到位。而如果刷200道,又会出现另一个问题:后期严重的疲惫感。我见过不少同学刷到150题以后,看着题号就开始生理性抗拒,遗忘曲线也特别难看,前面刷过的题基本忘了一半。100道是“广度覆盖”和“精力承受”之间一个非常微妙的平衡点。
还有一个数据层面的原因。从大量真实面经来看,算法类面试的题目来源高度集中,头部100题已经能覆盖相当大比例的高频考点。这不是玄学,而是统计规律:越是经典的题,越容易被反复使用,因为面试官也需要一个稳定、可信、区分度高的题库。
2. 刷Hot 100前必须想清楚的4个问题
2.1 目标决定刷法:面试突击vs长期提升
开始刷题之前,最有必要做的一件事是:明确自己的目标。如果你的目标是两三个月后的面试,那核心诉求应该是“见题有思路,写题够快手”,求的是覆盖率和熟练度。这种时候,不需要把每道题都挖出五种解法,也不用在一个优化细节上死磕一整天。你的验收标准很简单:看到题能快速匹配到对应套路,写代码不卡壳。
但如果你是工作后想系统补强算法基础,情况就不一样了。长期提升的刷法应该更“重”:多花时间在复杂度分析上,尝试一题多解,把每道题背后的状态转移思想、递归逻辑吃透。我见过很多人的误区是一上来就开刷,刷到一半开始焦虑。其实先给自己定一个明确的验收标准,是“能做对”还是“能讲明白”,这两种刷法的节奏完全不同,混在一起很容易两头不讨好。
我自己是两种模式都走过。校招突击阶段,我给自己定的标准是“高频题全部能在20分钟内写出无bug代码”;后来带新人时,我更多引导他们往“讲明白”方向走,因为能讲明白意味着你在面试高压环境下也不容易慌。
2.2 基础储备:你需要会多少数据结构
直说结论:Hot 100的题目不会超出常见数据结构的范围,但你也别指望零基础直接上手就能行得通。你需要掌握的硬性技能包括:数组、链表、哈希表、栈、队列、树(二叉树为主)、图(少量出现)、堆、字符串处理,以及算法层面的二分查找、双指针、滑动窗口、递归、动态规划、贪心、回溯、并查集。
这里我有一个特别简单的自测方法:如果你连二叉树的前序遍历、中序遍历都写不顺,或者连“栈和队列的区别”都讲不利索,那我建议先花一周补基础。这一周对应的就是磨刀不误砍柴工的投资,磨完刀再进Hot 100,效率会比硬刷高太多。
零基础直接刷Hot 100不是不行,而是挫败感会非常强。我见过一个同学第一天就从“两数之和”刷到“最长回文子串”,结果卡了半天没做出来,第二天就直接弃坑了。基础数据结构这块,完全可以找一本入门书或者一套基础视频,集中突击三到五天,把这块短板补上再进题单。
2.3 时间和节奏怎么安排
刷题最忌讳的是“三天打鱼两天晒网”,比这个更忌讳的是“每天刷很多,但从来不回顾”。以我个人的经验,比较稳的节奏可以拆成四段:
- 第一轮:每天3到5道分类题,约三周完成第一遍全量覆盖。
- 复习周:每周挑一个周末,把本周做错的题单独抽出来重新过一遍。
- 第二轮:每天按频率顺序刷10道左右,约两周完成第二遍。
- 冲刺轮:模拟面试,每天随机抽两道,规定时间内讲思路加写代码,约一周调整状态。
整体算下来是两到三个月。这里我想特别强调,“周期性回顾”是节奏里的灵魂。单纯从头刷到尾,刷到第80题的时候,第20题大概率已经忘得差不多了。这是人类记忆的正常规律,不丢人,丢人的是明知道会忘还不安排复习。
2.4 选语言:一道题该用几种语言刷
如果你的目标公司面试明确指定了语言,比如有些岗位要求Java或C++,那就直接用指定语言刷。没有指定的话,主流选择是Python、Java或者C++。我的个人感受是,Python写起来最快,语法最贴近思路表达,非常适合刷题阶段快速验证想法;Java和C++则对工程习惯、内存管理意识培养更友好,面试时也显得更传统、更稳重。
我的建议是:主语言一门,花大力气刷透;看题解的时候最好能看懂另一种语言,因为LeetCode讨论区里很多高质量题解是用C++写的,你看得懂才能吸收精华。千万不要贪多,三四种语言同时刷,会把大量精力浪费在语法切换上,反而忘了刷题的真正目的是训练算法思维。
3. 我的Hot 100三遍刷法(核心实操)
3.1 第一遍:分类刷,建立题感
第一遍的核心目标不是“快”,而是“建立模式识别能力”。我采用的方式是把100道题按数据结构和算法分类,然后每天集中攻一类。比如:
- 数组/哈希表:约20题
- 链表:约10题
- 树/二叉树:约15题
- 动态规划:约15题
- 回溯/DFS/BFS:约15题
- 双指针/滑动窗口:约10题
- 二分/堆/贪心/栈:约15题
每天一个主题,把同类题放在一起做,效果是立竿见影的。举一个最典型的例子:做完“两数之和”之后,再去做“三数之和”,你会立刻发现“排序加双指针”的思路并不是孤立存在的;“三数之和”解决了,后面的“四数之和”也只是外层再套一层循环。这种横向对比带来的“顿悟感”,是分类刷法最大的红利。
第一遍做题的时候,我的要求很简单:独立思考20分钟,想不出来就看题解,但看完题解必须合上答案,从零开始完整地写一遍代码。这个过程虽然慢,但它逼着你把“看懂了”真正变成“会做了”。第一遍最怕的就是自我欺骗,眼睛会了不等于手会了。
3.2 第二遍:按频率刷,死磕薄弱点
第一遍之后,第二遍我建议直接按题目热度从高到低刷。这时候重点已经不是“会不会”,而是“快不快、稳不稳”。每一题都给自己限定时间:简单题15分钟,中等题30分钟,困难题45分钟。超时了不要急着看题解,先把卡住的位置和想法写下来,再去看答案。这个写下来的动作,能帮你精准定位自己的薄弱点。
我印象很深的是“LRU缓存机制”这道题,第一遍刷的时候我就觉得懂了,但第二遍限时刷的时候,我在删除节点和更新顺序上卡了快十几分钟。后来才意识到,自己对双向链表加哈希表的组合不够熟。如果没有第二遍限时,这个短板可能在面试现场才会暴露,那就晚了。
第二遍还有一个附带任务:优化第一遍的代码。很多题在第一遍时能用嵌套循环跑通,但第二遍就要逼自己想清楚能不能降时间复杂度。比如把暴力解法降到O(nlogn),再进一步降到O(n)。这个过程,才是刷题真正增值的部分。
3.3 第三遍:模拟面试,盲刷和讲题
第三遍是最容易被忽略,但恰恰是决定面试成败的一环。具体做法是:随机抽题,完全不看题号,按照真实面试流程走一遍。先复述题意给面试官听,确认边界条件,然后说暴力解法、分析复杂度,再给出优化思路,最后动手写代码,并跑几个测试用例验证。
这一步最反直觉的地方在于,你要“出声讲题”。我刚开始练的时候非常不适应,明明思路是有的,但组织成语言就变得磕磕巴巴。后来我给自己注册了一个笔记工具,把自己讲题的录音录下来,回放一听,问题一目了然:开头不说边界条件、复杂度随口编、代码风格不够干净。这些都是真实面试中会被扣分的点。
我还试过一种更狠的练法:约一个同样在刷题的朋友,两个人轮流当面试官,每周模拟两场。当对方问出“你这个解法有没有更优空间”的时候,你被迫去重新审视自己的代码,这个被追问的过程就是最好的训练。第三遍如果能练到“随机抽一道Hot 100的中等题,在五分钟内讲清楚思路骨架”的水平,面试状态基本就有了。
3.4 每类题型的核心套路速查
刷完两三轮之后,我整理了一套自己的套路速查表,在这里分享给你:
| 题型分类 | 核心套路 | 典型题目代表 |
|---|---|---|
| 数组/哈希 | 哈希表把查找从O(n)降到O(1),空间换时间 | 两数之和、最长连续序列 |
| 链表 | 哨兵节点处理边界,快慢指针判环,反转用三指针模板 | 反转链表、环形链表 |
| 二叉树 | 递归优先,二叉搜索树思考中序遍历 | 二叉树中序遍历、验证二叉搜索树 |
| 动态规划 | 先画状态转移表,明确base case和遍历方向 | 最长递增子序列、爬楼梯 |
| 回溯 | 画决策树,排序加去重剪枝 | 全排列、子集、组合总和 |
| 双指针 | 数组有序优先考虑对撞指针,子串问题考虑滑动窗口 | 三数之和、无重复字符的最长子串 |
这张表不是万能的,但能解决Hot 100里八成的套路识别问题。当你拿到一道新题,先问自己三个问题:数据是什么结构?暴力解怎么想?能不能用表中对应的套路优化?这三个问题如果能快速走通,你就已经具备了应对大多数面试题的分析能力。
3.5 代码示例:以“两数之和”看清核心思路
很多人觉得“两数之和”简单,但恰恰是这道题最能说明“哈希表把查找降到O(1)”这件事。暴力解法是两层循环,时间复杂度O(n²)。而用哈希表,我们可以边遍历边查,把目标值减当前值的差作为key去哈希表里找,找得到就直接返回。
def two_sum(nums, target): seen = {} # 用字典记录已经遍历过的值,value存下标 for i, num in enumerate(nums): diff = target - num if diff in seen: # 哈希表查找平均O(1) return [seen[diff], i] seen[num] = i # 当前值加入哈希表 return []我第一次刷这道题时,其实也是先写出了两层循环的版本,AC之后才想明白哈希表解法的价值。后来我把这道题的思路迁移到“四数相加”“无重复字符的最长子串”里,才真正体会到:刷Hot 100练的不是背题,而是把“空间换时间”这类思想内化成肌肉记忆。
4. 我在刷题过程中踩过的坑
4.1 过度追求AC数和速度
我第一遍刷Hot 100时也是个速度党,看到一道题能AC就兴奋得不行,刷到80多题的时候飘飘然,觉得自己已经是“题场老手”。结果一次模拟面试,面试官让我讲“最大子数组和”,我脑子一片空白,只能背出代码,却说不出状态转移方程为什么这样设计,当场就被问穿了。
AC数是个巨大的烟雾弹。能跑通测试用例,只是最低门槛;对自己的要求应当是能复现解题思路、能推导复杂度、能应对追问。从那之后,我给自己立了一个规矩:每刷完一题,在题解笔记里写下三个要点——这题考什么、关键思路是什么、可以迁移到哪些同类题。没有这三行字的题,等于没刷。
4.2 只看题解不动手
这是刷题圈最普遍的坏习惯,我也没能幸免。卡了五分钟就翻题解,看完恍然大悟,“原来这么简单”,合上答案,第二天再碰到同类题依然写不出来。后来我才意识到,看题解时产生的“懂了”是一种错觉,那是题解作者的思路,不是你的思路。
我给自己定的规矩是:独立坚持20分钟,实在没有突破才能看题解。但看完之后必须合上答案,从零开始完整写一遍。这个过程我称之为“重写”,它的作用相当于把别人的思路先在脑子里过一遍,再通过手写变成自己的表达能力。Hot 100里的题大多都有多种解法,每次重写都让我更接近“理解”而不是“背诵”。
4.3 忽略时间复杂度的推导
Hot 100里很多题的暴力解都能跑通测试用例,这也是很多人觉得自己“已经会了”的原因。但面试考的根本不是能不能跑通,而是你有没有能力把复杂度降下来,并且说得清为什么。我刷“最长连续序列”的时候,第一次写的其实已经是O(n)的正解,但面试官追问“为什么你的复杂度是O(n)而不是O(n²)”时,我居然支支吾吾说不出来,因为当时我只是凭感觉用了哈希集合,并没有真正理解每个元素只会被访问一次这件事。
从那以后,我养成一个习惯:每道题写完,强制自己口述一遍时间和空间复杂度,并且说出推导依据。这一步刚开始很别扭,但练多了就变成了条件反射。面试中,当你能主动说出“这个算法是O(nlogn),瓶颈在排序”时,给面试官留下的印象会完全不同。
4.4 孤立刷题,不做总结
Hot 100之所以叫“热题”,是因为这些题之间有大量重叠的思维模式。如果只是一题一题做过去,追求“已刷数量”,不总结题型共性,那么面试官把题目稍微变形,你就会露怯。举一个例子:“无重复字符的最长子串”和“最小覆盖子串”都是滑动窗口,“找到字符串中所有字母异位词”也是滑动窗口。这三道题如果单独刷,每次都要重新想一遍窗口伸缩逻辑;但如果放到一起总结一次,滑动窗口的right指针延展、left指针收缩模式,就会变得像条件反射一样清晰。
我强烈建议建立自己的速查笔记。我的做法是每道题留三行:核心思路、时间复杂度、可迁移的套路,再配上LeetCode讨论区精选题解的链接。这样一来,刷题不是把100个孤岛装进脑子,而是编织成一张可以互相调用的方法网络。
5. 从Hot 100到真正拿下面试
5.1 面试中如何复现刷题效果
很多人题刷完了,面试还是发挥失常,问题出在环境差异上。面试不是安静地对着LeetCode提交代码,而是面对一个活人,一边写代码一边解释思路,还要随时应对追问和打断。所以我特别推荐一个方法:把Hot 100当作模拟面试题库,约一个水平相当的朋友互相出题,或者自己对着镜子白板讲题。
这轮训练的核心指标有两个。第一,能在五分钟内说清一道中等题的思路骨架,包括复杂度分析。第二,能在30分钟内稳步写出没有低级别bug的代码。如果这两条都做到了,面试时的状态就会跟平时刷题非常接近。我见过太多人平时刷题666,一到面试手抖,不是因为不会,而是因为从来没在“有人看着”的情况下写过代码。
5.2 面试官角度:他们考的不是题本身
当我后来参与过部分招聘流程后,对算法面试的理解又深了一层。面试官拿Hot 100里的题考你,不是要看你会不会做这一道题,而是要透过这道题观察你:遇到陌生问题时的分析路径是什么,沟通中能不能主动确认需求,复杂度意识是否到位,代码看起来干不干净、稳不稳。
这里有一个刷题党容易忽略的细节:主动澄清需求。LeetCode上的题目描述已经写得很清楚,但在真实面试中,边界条件往往需要你主动去问。比如输入可能为空怎么办,数组里有重复元素怎么办,目标值不存在怎么返回。这种看似跟算法无关的小动作,其实性价比极高,能体现出你的工程素养和沟通习惯。
5.3 Hot 100之后的扩展路线
Hot 100是很好的起点,但不是终点。如果你时间充裕,我比较推荐按顺序走这三步:先把Hot 100的错题和薄弱题型第二轮刷干净;然后刷LeetCode精选Top 200或剑指Offer作为补充;最后再针对目标公司的面经题做专项强化。尤其是动态规划专题,很多同学在Hot 100里已经接触到了基础题,但DP是典型的“多做多会、少做必忘”的题型,值得额外花时间巩固。
我的个人体会是,把Hot 100吃透,加上一两周的专项强化,覆盖大部分一线公司算法面试已经比较稳了。但如果目标是核心部门或者更高难度岗位,光靠这一百题肯定不够,还需要补充更系统的算法训练和一定的题量储备。Hot 100真正教会你的,是那一套“先想清楚再动手”的思考方式,这条路走通了,后面的题都只是新皮囊、老套路。
最后分享一个我坚持了很久的小习惯:刷完Hot 100之后,我没有把它从收藏夹里删掉,而是把它当成一份“体检清单”。每隔两三个月,随机抽10道题出来自测一遍,看看自己的水平有没有退化。算法能力就像肌肉记忆,长期不刺激一定会松懈。而Hot 100这份题单最珍贵的价值,也不是刷完那一刻的成就感,而是它帮你在反复练习中沉淀出的那份遇题不慌、分析清晰的底气和节奏感。