力扣刷了800题后我劝你先停下来:刷题数量和面试通过率根本不是线性关系

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

📖 摘要:一个在力扣上刷了800多题、Rating卡在1850上下的普通程序员,聊聊刷题边际效用递减这件事。为什么Hot100刷完还是不会做题?力扣的难度标签为什么不靠谱?周赛分高就代表面试能过吗?

先报一下家底,免得被说是空口白话

图片

我力扣中国站账号注册于2019年9月,到现在提交记录大概2300多次,AC的题数是812道(前几天刚数的,会员到期了看不到具体分类统计,只能按题库页面的进度条估算)。周赛最高打到过1876,现在稳定在1700-1800之间晃悠,属于那种前两题稳定AC、第三题看运气、第四题基本放弃的水平。

说这个不是想吹,恰恰相反——刷到第600题左右的时候,我突然意识到一个问题:我刷题的速度在变快,但遇到没见过的题时的反应速度并没有明显提升。更诡异的是,2022年秋招我拿着这份刷题量去面试,被一道「合并K个升序链表」的变体问住了,当时脑子里的第一反应是「这题我好像AC过」,但具体怎么写完全想不起来。

那次面试挂掉之后,我回去翻自己的提交记录,发现这道题我提交过4次,最后一次是面试前两个月。也就是说,我看过、我写过、我过了,但我没记住

这件事让我开始重新看待刷题这件事。

力扣的难度标签,可能比你想象的更不靠谱

图片

先说一个我验证过的事。力扣的「简单/中等/困难」标签并不是按照思维难度来划分的,它更像是一个通过率区间的映射。简单题通过率通常在50%以上,中等在30%-50%,困难低于30%。这个划分方式带来一个直接后果:一道题如果测试用例很坑、边界条件多,哪怕思路很直白,也会被标成「中等」。

举个例子,第7题「整数反转」,标签是中等。你只要处理一下INT_MAX和INT_MIN的溢出问题就能过,逻辑本身不超过10行。反而是第136题「只出现一次的数字」,标签是简单,但如果你没学过异或的性质,第一次做大概率想不出来,会去用哈希表做——能过,但空间复杂度从O(1)退化到O(n)。

我在2021年做过一个粗糙的统计,把当时Hot 100里的题目按我自己觉得的「思维难度」重新打了一遍分,结果和官方标签的重合度大概只有六成出头。有些被标成简单的题,我觉得比某些中等题还难想。

所以如果你卡在某道「简单」题上超过20分钟,别怀疑自己智商,可能只是这题的标签定得有问题。

周赛Rating这个东西,骗了很多人

图片

力扣的周赛Rating用的是Elo的变体,初始分1500,每场比赛根据你的排名和对手分差来加减。双周赛是隔周的周六晚上22:30(北京时间),周赛是周日上午10:30,时长都是1小时30分钟。

我认识一个Rating 2100+的朋友,国内某大厂P7。他有一次跟我吐槽,说他们组招人面试的时候,看到简历上写「力扣周赛稳定前500」,第一反应不是加分,而是「这人是不是没什么项目可写」。

周赛本质上是一个限时抢分的游戏。前两题(通常是一道简单一道中等)大部分有经验的选手能在20分钟内解决,第三题是分水岭,第四题是给顶尖选手准备的。你为了提高Rating,最有效的策略不是提升算法能力,而是提升手速和模板熟练度。很多高Rating选手的代码里全是肌肉记忆式的快排、并查集、线段树模板,比赛时直接贴上去改两行。

这套能力在周赛里很值钱,但在实际工程面试里价值有限。面试官更在意你能不能把一个模糊的问题拆解清楚,能不能和面试官讨论trade-off,而不是你在15分钟内手写出一棵平衡树。

我不是说周赛没用,它能逼你在压力下写代码,这个训练是真实的。但别把Rating当成能力的唯一度量,更别指望Rating高了面试就稳了。

图片

刷题的边际效用,在第150题左右就开始衰减了

如果让我给一个具体的数字,我会说:对于大部分人来说,认真刷150-200道题(覆盖所有主要题型),收益已经能达到总收益的70%左右。从200题到500题,收益大概再增加15%。500题往后,除非你是冲着竞赛去的,否则增量收益非常有限。

为什么是150这个数?因为力扣的题目虽然多(中国站目前3400+题,会员题另算),但核心题型的数量是有限的。双指针、滑动窗口、二分、DFS/BFS、回溯、动态规划、单调栈、并查集、拓扑排序、前缀和……这些大类加起来也就20个左右,每一类吃透5-8道有代表性的题,就能覆盖面试中80%以上的场景。

剩下那些题,大部分是同一题型的变体,或者是某个公司面试时出过的偏题。刷它们能让你在遇到原题时反应更快,但不能提升你解决新问题的能力

图片

我自己是从第400题开始意识到这点的。当时我在刷「会员专属」的题目,刷到一半突然觉得不对——我在花时间记一些我根本用不上的东西,而我的项目代码已经两个月没动过了。

后来我调整了策略:每周只刷3-5道题,但每道题都要写题解,手写一遍复杂度分析,隔一周再重做一次。题量掉下来了,但我能明显感觉到遇到新题时的思路比以前清晰。

如果你现在刷到一半,我给几条具体的建议

第一,别按题号顺序刷。从「面试经典150题」或者「Hot 100」开始,这两个题单是经过筛选的,覆盖了主流题型。刷完再考虑其他的。

第二,每道题至少做两遍,中间间隔一周以上。第二遍如果还是要想很久,说明第一遍根本没学进去,只是在看题解。

图片

第三,给每道题打上你自己的标签,不是力扣的标签。比如「这题的核心是单调栈+贪心」「这题的边界条件很坑」,用你自己的语言记下来。这个动作看起来浪费时间,但它是把短期记忆转成长期记忆的关键。

第四,别用会员的「题目解析」功能替代自己思考。我买过一年会员,最大的感受是这个功能会让人变懒,看解析的爽感会让你误以为自己会了。

第五,也是最重要的:刷题只是手段,不是目的。如果你已经开始为了刷题而刷题,为了保持每天的打卡记录而随便找道简单题水过去,那还不如去写个项目、读读源码、或者干脆休息一天。

我现在的状态是,题单停在了812道,不打算再往上冲了。每周挑两道以前做过的中等题重做,偶尔打一场周赛看看手感还在不在。剩下的时间拿去写代码、看论文、陪家人。

刷题这件事,够用就行。

🏷️ 标签: