力扣刷到600题面试照样挂:复盘三年提交记录后,我改掉的几个刷题习惯

🔑 关键词:力扣,LeetCode,刷题方法,算法面试,Hot100

📖 摘要:一个刷了600多道力扣题、面试仍然被变体问懵的普通人,翻出自己的提交数据后,聊聊力扣刷题里那些看起来在努力、实际在自欺的坑,以及具体怎么改。

先说那个让我破防的下午

图片

2023年秋天面一家做基础架构的公司,二面手撕代码。面试官给的是 LC 53 最大子数组和的场景,我一看就笑了,Kadane 算法写过不下十遍,三分钟写完,还主动报了个 O(n) / O(1)。面试官点点头,然后问:如果要求子数组长度不能超过 k 呢?如果要输出这个子数组本身而不只是和呢?如果数组首尾相接成环呢(其实就是 LC 918)?

我卡在那里,草稿纸上画了半天,最后写了个错的双指针。挂得心服口服。

回家我打开力扣个人主页,翻提交记录——LC 53 我总共提交过 7 次,最近一次就在面试前 12 天。也就是说,我花了三年、刷了 600 多道题,依然没真正拿下这道“简单题”。那天晚上我把整个提交历史导出来看了一遍,才发现问题根本不在题量上。

图片

我的提交数据,比我想象的难看

力扣个人主页会显示通过题数和总提交数(不是题解区那种,是你自己的历史)。我截了个图:通过 612 题,总提交次数大约 2870 次,平均每题提交 4.7 次。以前我一直觉得提交多说明我“肯钻研”,那天才反应过来——大部分提交是“改个边界试一下”“把 <= 改成 < 试试”,根本不是想清楚再写。

对比一下,我认识一个去了某大厂做编译器的朋友,他通过题数只有 240 多,但平均每题提交不到 1.8 次。他说自己有个习惯:写完不点提交,先在草稿纸上手动跑三个用例,包括空数组、单元素、全负数这种恶心边界。想清楚了再敲。

图片

这个差距不是手速,是“在脑子里调试”和“在判题机上调试”的区别。面试的时候没有判题机,只有面试官的眼睛。

力扣的产品设计,其实在温柔地骗你

我不是要黑力扣,它的题解区、竞赛、企业题库做得非常成熟,国内没有替代品。但它的核心反馈是 AC / WA,这个二元信号会给你一种“过了就是会了”的幻觉。

问题在于力扣的测试用例对不少题是偏弱的。比如 LC 15 三数之和,你用带剪枝的 O(n²) 暴力写法,在某些语言下照样能过;LC 200 岛屿数量,如果你只测大的连通块,DFS 递归深度不到栈上限,某些本该爆栈的写法也能过。

图片

而 Codeforces 不一样,它有 hack 机制,你赛后会被别人用极端数据干翻。我后来断断续续打了大概 60 场 CF,Div2 的 C 题经常是构造题,没有模板可套,那种“被迫从零想”的感觉,是力扣很难给的。面试官本质上就是一个人肉 hack 系统,他专门挑你没测的边界问。

具体怎么改:一份我自己的变体清单

我把 Hot 100 里的高频题重新过了一遍,每道题强制写 2-3 个变体,记在一个 Notion 表里。举几个真实例子,你可以直接照抄思路:

图片

  • LC 1 两数之和:原题哈希表 O(n)。变体一,数组已排序怎么办(双指针 O(n) / O(1) 空间);变体二,返回所有不重复的数对;变体三,数据流版本,要设计一个结构支持 add 和 find。
  • LC 53 最大子数组和:变体一,输出子数组本身;变体二,长度不超过 k(这个要单调队列);变体三,环形版本 LC 918。
  • LC 200 岛屿数量:变体一,用并查集重写;变体二,数据流动态加岛屿;变体三,求最大岛屿面积(LC 695)。
  • LC 146 LRU 缓存:变体一,泛化成 LFU(LC 460);变体二,给每个 entry 加 TTL;变体三,线程安全版本要加什么锁。

还有两个操作层面的东西。第一,三遍法:第一遍不看题解,计时 30 分钟,做不出来就认输;第二遍看题解,手写到能给别人讲清楚;第三遍隔 7 天盲写,只看题目不给提示。第二,找几道题用 ACM 模式(自己处理输入输出)重写一遍,因为很多公司的在线笔试就是 ACM 模式,你平时习惯核心代码模式,笔试当天读输入能读哭。

会员、周赛这些,我的真实态度

图片

力扣会员我买过两年,一年 1000 出头(具体价格会变,别杠)。锁着的会员题大概 400 多道,但说实话,如果你 Hot 100 都没吃透,会员的钱基本是打水漂。真正有价值的是企业题库和面经关联,但那是你已经有 200 题手感之后的事。

周赛我打了大约 60 场,竞赛分从初始 1500 上到 1680 左右就卡住了。周赛对思维速度有帮助,中国站每场参赛的三四千人里,前排那些人是真的强。但如果你目标是面试,周赛的性价比不如精刷变体——周赛考的是 90 分钟四道题的取舍能力,面试考的是 45 分钟一道题讲清楚的能力,两回事。

最后说个心态上的事。我一度因为看到别人“刷了 1500 题”而焦虑,后来发现那人连 LC 146 的双向链表 + 哈希表都写不利索。题量是个很容易注水的指标,提交次数、变体覆盖、能不能白板讲清楚,这些才是硬通货。刷题这事,慢一点、多想十分钟,比多刷一百道有用。

🏷️ 标签: