LeetCode 刷题指南:为什么你刷了 300 题还是面不过大厂

LeetCode 刷题指南:为什么你刷了 300 题还是面不过大厂

你可能听过这种说法:进大厂就是刷题,刷够 300 题稳拿 Offer。其实这话挺扯的。

很多人每天像打卡一样在那儿“刷”,结果面试官稍微把题目背景一换,或者让你解释一下时间复杂度里的常数项,立马就懵了。这不叫刷题,这叫搬运代码。真正的 LeetCode 刷题指南 不应该只是告诉你去刷哪道题,而是得教你如何建立那一套该死的算法直觉。

算法面试本质上是在有限时间内的一种压力测试。

如果你只是死记硬背答案,那在面试官盯着你看、手心冒汗的情况下,你的大脑内存会迅速溢出。你需要的是肌肉记忆,而不是缓存。

刷题的核心误区:数量真的不代表质量

很多人引以为傲的是自己的 LeetCode 提交记录绿了一大片。可是,如果你这 500 道题里有 400 道是看着题解写出来的,那这个数字除了安慰你自己,没有任何卵用。

盲目追求数量是新手的通病。

✨ Don't miss: Mac Studio M4 Max Explained: The Sweet Spot Most People Miss

你得明白,大厂的面试官,尤其是像 Meta、Google 或者字节跳动这种公司的,他们手里有一万种方法拆穿你的“背题”行为。他们会追问:为什么这里用 HashMap 而不是 TreeMap?如果内存放不下这个数组怎么办?你能用迭代重写这个递归吗?

如果你刷题的时候只求过(Accepted),而不去深挖背后的逻辑,你就是在浪费时间。

放弃“题海战术”

比起刷 1000 道题,我更建议你把《算法小抄》或者《剑指 Offer》里的经典题目反复磨三遍。第一遍你可能觉得自己是个笨蛋,这很正常。第二遍你会开始发现某些题目的影子,比如看到“求最长子串”就会想到滑动窗口。第三遍,你应该能闭着眼睛写出最优解,并且能给别人讲明白为什么这么写。

这种深度,比你浅尝辄止地刷几百道题有用得多。

LeetCode 刷题指南:你应该按照什么顺序上手?

别一上来就点开“热题 100”然后按顺序做。那是找虐。

科学的路径应该是按 数据结构和算法分类 来。你得先把地基打好。如果你连链表怎么反转都写不顺溜,去挑战什么动态规划(DP)简直就是自杀。

先从数组和链表开始

这是最基础的。搞清楚指针是怎么移动的,什么是快慢指针,什么是越界。
很多复杂的算法,拆解到底层其实就是对数组的操作。搞定了双指针法,你就能解决 30% 的简单和中等难度题目。比如 LeetCode 141 题(环形链表)和 26 题(删除有序数组中的重复项),它们的核心逻辑惊人地相似。

树和图:面试的重灾区

基本上 80% 的大厂面试都会考树。为什么?因为树的结构天生适合考察递归。
如果你搞不懂深度优先搜索(DFS)和广度优先搜索(BFS),那你的面试基本凉了一半。一定要死磕二叉树。把前序、中序、后序遍历写到吐为止。这时候你会发现,原来很多题目换汤不换药,只要套上递归模版,问题迎刃而解。

动态规划:别被名字吓到

DP 是很多人的噩梦。其实它就是“带缓存的递归”或者“从底向上的推导”。
你不需要去钻研那些奥数的竞赛题。大厂考 DP,通常考的是最经典的几类:背包问题、最长公共子序列、打家劫舍。
关键在于找 状态转移方程
如果你找不到,那就先写暴力递归,然后再想办法加个 Memoization(备忘录),最后再尝试优化成迭代。

别只在网页上写代码,这会害了你

LeetCode 的编辑器太温柔了。它有语法高亮,有时候还有自动补全。

但是,很多公司的面试是在 Google Doc 或者是那种白板工具上进行的。没有高亮,没有提示,甚至没有缩进。

你要学会白板写代码(Whiteboarding)。

✨ Don't miss: iPhone 17 Pro Max specifications: Why This Upgrade Actually Changed Everything

尝试在纸上或者是简单的文本编辑器里写代码。这能强迫你记住 API。如果你在面试时因为记不住 StringBuilder.append() 还是 StringBuilder.add() 而卡住,那场面会非常尴尬。虽然面试官通常不会因为一个小语法错误挂掉你,但这种生疏感会极大地打击你的自信。

那个被忽视的细节:复杂度分析

我见过太多求职者写出了代码,却说不清时间复杂度是多少。

“大概是 $O(n^2)$ 吧?”

这种语气一出来,面试官心里就给你打了个叉。你得确定。
你需要练习如何分析递归的时间复杂度,尤其是当涉及到递归树的时候。你要能熟练地说出空间复杂度是多少,是否可以原地(In-place)优化。

如果一个算法的复杂度是 $O(2^n)$,你应该立刻意识到这通常不是最优解,除非数据规模极小。

模拟面试:对抗焦虑的唯一手段

你自己刷题的时候心平气和,旁边有人盯着你、计时 45 分钟的时候,完全是两码事。

找个朋友互相 Mock,或者去 Pramp 这种平台找陌生人练习。
你会发现,当你需要边写代码边说话(Think Aloud)时,你的智商会下降 50%。这是因为你的大脑正在被“逻辑思考”和“语言表达”同时占用。

这种能力是可以练出来的。

你要练习如何在写代码之前先跟面试官沟通你的思路。
“我认为这道题可以用双指针来解,时间复杂度是 $O(n)$,空间复杂度是 $O(1)$。您看这个思路可行吗?”
得到肯定后再动笔,能避免你写了一大堆发现思路错了的惨剧。

关于语言的选择:别纠结了

用你最熟悉的。

Java、C++、Python 都可以。
如果你想追求写题速度,Python 的语法糖确实爽,几行代码搞定 Java 几十行的量。
但如果你面的是后端开发,面试官可能会更喜欢看到你用 Java 或 C++ 展示对底层数据结构的控制力。
关键不在于语言,而在于你是否真的懂这个语言的特性。别在用 Java 刷题时连 HashMapConcurrentHashMap 的区别都不知道。

行动方案:接下来你该做什么

说了这么多,如果你今天就开始打算正儿八经刷题,建议按照这个节奏来:

  1. 分板块突破:花两周时间只做链表和树。再花两周只做搜索和排序。别跳着做。
  2. 强制限时:一道 Medium 难度的题,30 分钟写不出来就直接看答案。死磕一下午是效率最低的行为。
  3. 复盘重写:看了答案后的第二天,不看题解重新写一遍。很多人觉得自己懂了,其实只是眼睛懂了,手还没懂。
  4. 积累模版:二分搜索的边界怎么写?滑动窗口的收缩条件是什么?这些常用的逻辑块应该形成固定的模版直接调用。
  5. 重视边界条件:空指针、数组越界、数值溢出。这些是面试官最喜欢抠的细节。

别把 LeetCode 当成任务,把它当成一种思维训练。当你不再害怕看到新题,而是能冷静地分析出它属于哪种模型时,这份 LeetCode 刷题指南 才算真正长在了你的脑子里。

去 LeetCode 随便挑一道你之前没做出来的 Medium 题,先别动笔,对着屏幕把思路大声说出来,看看你能不能逻辑自洽。

这是第一步。