先说一件让我破防的事
我得坦白一个不太光彩的经历。2023 年 3 月的一个周日早上,我坐在电脑前打力扣周赛,第三题卡了整整四十分钟,最后因为超时两分钟没交上去。那道题当时的分数区间大概在 1700 左右。赛后我点开讨论区,第一条回复只有一句话:这不就是换了个壳的拓扑排序吗,然后贴了二十行代码。
我不知道你有没有过那种感觉。不是不会做,是压根没往那个方向想。你盯着题目里的「区间」「最大值」「最少次数」这些词,脑子里冒出的是滑动窗口和贪心,结果人家考的是图论建模。
那次之后我开始怀疑一件事:力扣给题目贴的那个难易标签,到底在衡量什么。我花了大概一年时间,把自己做过的两百多道题重新标了一遍,结论是——官方的三档标签,有四分之一到三分之一跟我的实际体验对不上。
通过率不是题目的属性,是做题者构成的属性
先把机制说清楚。题号旁边那个 Acceptance Rate,是「通过提交次数 ÷ 总提交次数」,不是「通过人数 ÷ 尝试人数」。这两个东西差别很大。一个人提交八次才过,和八个人各提交一次全过,在统计上完全是一回事。
更关键的是分母里站着谁。一个做过八百题的人点开第 4 题 Median of Two Sorted Arrays,大概率一次过;一个刚学完数组的新手点开第 1 题 Two Sum,可能要想半小时。题目被谁做,决定了它的通过率,而不是题目内在的认知负荷决定通过率。这是反向因果。
而且这个偏差会随时间放大。一道 2015 年就存在的老题,十几年间被几十万人踩过,题解、视频、博客铺满全网,你现在做它的时候,脑子里早就被剧透过了一部分。一道上个月刚加进来的新题,哪怕思路平平无奇,通过率也会低一截。
我给你几组可以自己去验证的数字。打开力扣,把鼠标悬停在题号上,通过率就出来了:
- 第 4 题 Median of Two Sorted Arrays,Hard,通过率四十出头
- 第 41 题 First Missing Positive,Hard,通过率四十出头
- 第 146 题 LRU Cache,Medium,通过率四十三左右
两个 Hard 和一个 Medium,挤在同一个数字区间里。但做过的人都知道,第 41 题的核心就是「把数字 x 放到下标 x-1 的位置上」来回交换,想通了五分钟写完;而 LRU Cache 你得同时维护哈希表和双向链表,还要处理容量为一、get 之后要移到头部、put 已存在的 key 要更新值这些边界,我见过太多人在面试里写到一半链表指针就断了。
反过来看,第 136 题 Single Number,Easy,通过率七十五左右。如果你不知道异或这回事,这道题对你是 Hard;如果你知道 a^a=0 和 a^0=a,它就是两行。它的难度完全取决于你脑子里有没有那一块拼图,跟标签关系不大。
题号顺序和题单顺序,又是另外两层滤镜
第 1 题到第 100 题是按时间顺序加进去的,不是按知识点递进的。Two Sum 用哈希表,第 2 题 Add Two Numbers 是链表指针操作,第 4 题是二分加分治,第 5 题最长回文子串是 DP 或者中心扩展。你在前五题里就被扔进了四个不同的知识领域。所以「按题号刷」这件事从第四题开始就崩了。
Hot 100 好一点,但它是按知识点分组的,不是按难度。你去看 Hot 100 里动态规划那一组,第 5 题最长回文子串和第 198 题打家劫舍是挨着的。前者是二维 DP 加边界处理的中上难度,后者是 DP 入门第一课。翻两页你就能从地狱到幼儿园,中间没有任何过渡。
还有一个坑是公司题库。力扣中国站的「公司高频题」是用户众包上传的,你看到的某个大厂题单,很可能是 2020 年某个人整理完之后再没更新过。技术栈和面试风格两三年换一轮,那个列表的时效性,远不如你自己用记事本记的面经。
顺带说一句题解区。点开任何一道热题,前三个高赞题解的结构几乎一模一样:思路、代码、复杂度分析,连话术都差不多。真正有信息量的往往是第八到第十五个赞那一档,那些是有人自己踩完坑之后写的。我印象很深的是第 239 题滑动窗口最大值的一条低赞题解,作者手画了一张单调队列的图,比高赞题解里贴的代码清楚十倍。
我自己的重排方法:用三个数替代三档标签
从 2023 年起,我每做完一道题,在本地记三个数:想清楚用了多久、敲代码用了多久、debug 用了多久。这三个数的比例,比通过率有用得多。
如果「想清楚」占了大头,超过总时长的六成,那这道题对你的真实难度就是 Hard 级,不管标签写什么,一周后必须重做。如果「敲代码加 debug」占大头,说明思路你已经会了,纯属工程手感问题,做一遍归档就够。如果三个数都很小,直接划掉,别再浪费时间搞什么三刷四刷。
按这套标准,我 2023 年做过的两百多道题里,官方标 Easy 的有十七道被我打上了 Hard 标记,官方标 Hard 的有九道被我降到了 Easy。重合度七成左右。这个数字不精确,也不需要精确,因为它本来就是给一个人自己用的尺子。
还有个附加操作:我会给自己做过的每道题写一句「识别线索」,只写一句,比如「看到区间最大值想到单调栈或稀疏表」「看到最少修改次数往 DP 转移上想」。半年之后回看,这一百多句识别线索,比任何题单都值钱。因为面试现场真正卡住你的,从来不是写不出代码,是没认出来这是哪一类题。
结尾我不想熬鸡汤
我不打算说刷题不重要这种话。在筛选这件事上,它依然有效,依然是最省事的过滤手段。但如果你已经刷了一百五十题,还是觉得没开窍,可能不是你不够努力,是你一直在用一把刻度不准的尺子量自己。
把官方标签丢掉一阵子,用自己的三个数重新标一遍。这是我这两年做过最有用的一件事,没有之一。