ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零开始学力扣中道崩殂?一份刷题复盘与避坑指南

从零开始学力扣中道崩殂?一份刷题复盘与避坑指南 我给自己挖了个坑然后非常守信用地把坑填完了——填的就是这篇名为《从零开始学力扣中道崩殂版》的复盘记录。刷题这件事网上的攻略一抓一大把什么三个月冲进大厂Hot 100 刷三遍保你面试无忧看得人热血沸腾。但很少有人愿意坦白说我刷着刷着刷不动了。不是题太难是人先崩了。我决定把这个人先崩了的过程原原本本写出来。如果你是刚开始想刷力扣的新手或者正在崩溃边缘挣扎这篇内容应该能让你少走几个月的弯路。1. 先说清楚这个项目到底是什么光看标题你可能觉得这是又一个刷题劝退贴。其实不是。这更像是我的个人项目记录项目名称就叫从零开始学力扣但最终交付物不是刷完多少题的成就清单而是一份诚实的、带血的、实操性极强的落地方案——只是这个方案在每天刷 2 小时的计划执行到第 47 天的时候宣布阶段性暂停也就是标题里说的中道崩殂。1.1 从零开始学力扣的完整背景先说下我自己的起点不然你没法理解后面为什么会崩。我本职是做业务系统开发的Java 为主日常写代码没问题CRUD 用得飞起但基本没有接触过严格意义上的算法训练。大学学过数据结构但那是七八年前的事了图的遍历、动态规划对我来说基本等于只记得名字。决定刷力扣的导火索很现实准备看机会想进一家技术氛围更浓的团队也知道如今面试算法题几乎是标配绕不过去。从零开始这四个字我当时想得太简单了。我以为的从零是从最简单的题开始刷。实际上的从零是从连力扣的编辑器都不会用开始。我第一次在力扣网页上写代码连输入输出的样例格式都看了半天更别提那些 Top 1%击败 99% 提交者的花式解法了。1.2 为什么是中道崩殂而不是坚持到底这是整个项目里最关键的定性。中道崩殂在我们的语境里通常带着点自嘲和遗憾。但我特意用崩殂想强调的是这段经历没有白费。它以一种惨烈的方式让我看清了刷题这件事的真实面貌——刷题不是靠一腔热血能赢的它需要更系统的策略、更诚实的自我评估以及更明确的阶段目标。我没有彻底放弃刷题而是放弃了从零开始学力扣这个宏大而模糊的项目换成了每天只刷一道简单题不加任何KPI的低压模式。也就是说第一版项目崩了但崩完之后我重新搭了个能跑的小项目。这可能是这篇文章对你最有价值的部分——你不需要重复我崩掉的过程直接拿走我重建之后的方案就行。2. 开局设想一份看起来完美无缺的刷题计划每个崩掉的项目都有一份精美的计划书。我也不例外。在正式打开力扣官网之前我花了整整一个周末做了一份让自己都感动到不行的计划。2.1 目标设定Hot 100 与热题 100 的双线推进我的核心目标非常明确刷完力扣热题 100同时结合最新的力扣热门题目清单也就是大家常说的 Hot 100双线推进。当时的逻辑是Hot 100 是面试高频题的精筛无论面什么公司把这 100 题吃透至少能应对大部分算法环节。我甚至做了一张 Excel 表格把 Hot 100 里的题目按标签全部分好类哈希、双指针、滑动窗口、二叉树、动态规划、贪心……还用不同颜色标出了已计划进行中待复习。第一版的计划特别唬人每天 2 道新题周末补 2 道复习30 天刷完前 50 题60 天整体过一遍第 70 天开始二刷。听起来是不是很合理问题是这份计划从头到尾只有刷题这个动作没有考虑不会做看不懂题解写出来但超时这些真实存在于刷题过程中的阻力。一个真正的计划应当把卡住的时间也计算进去。我当时的计划相当于默认了每道题都会在自己的控制范围内按预期推进这个假设从一开始就是错的。2.2 语言选型为什么选了 Java 刷力扣作为一个业务出身、日常写 Java 的人选 Java 刷题几乎不用思考。Java 的生态我太熟悉了不需要边刷题边查语法。而且 Java 在力扣上有几个天然优势丰富的集合类比如 HashMap、HashSet、PriorityQueue 直接当堆用StringBuilder 处理字符串拼接Arrays 工具类的排序、拷贝。这些 API 能让核心算法的实现变得相当清爽。但 Java 也有很烦人的地方。比如刷到树的题目力扣给的是 TreeNode 定义你得自己搞清楚引用关系刷到链表的题得时刻注意空指针。C 选手可能更奔放直接用指针硬刚Java 就得老老实实搞对象引用。更扎心的是Java 的代码在力扣上的耗时通常比 C/C 长一点有时候同样的思路Java 就是踩在超时边缘。我没换语言因为换语言的成本远大于它可能带来的收益。新手选刷题语言就一条标准哪门语言你写得最熟就选哪门不要为了性能更好大佬都用它去学一门新语言来刷题那样等于同时学两件事必崩。2.3 时间安排每天 2 小时与可行性幻觉我给自己定的时间安排是工作日每天晚上 2 小时周末每天 3 到 4 小时。加起来一周接近 18 小时怎么看都够用。真实情况是我的每天 2 小时平均要打五折。下班到家已经八点多吃完饭歇一会儿坐到电脑前最快也要九点。刷题这件事还有一个巨大的陷阱——它不是打开网页就开始的。你需要先读题读一遍没读懂读两遍。然后开始想思路想不出来翻题解。题解不是一个字一个字看完就完了你得理解得验证得自己敲一遍敲完发现提交报错再看错误样例改再提交。这么一套流程下来2 小时只够刷一道题而且不是那种游刃有余地刷完还能总结的状态而是勉强看懂别人怎么解的状态。我后来算过一笔账按照我真实的效率完成 Hot 100 的第一遍大约需要 250 到 300 小时而不是计划的 150 小时。这个误差直接决定了项目的崩盘节奏——计划越宏伟落差越崩溃。3. 实战记录从某一次的蜜月期到逐渐崩溃的真实刷题过程计划归计划真正让我一个字一个字写下这篇复盘的是那些实打实坐在电脑前、面对编辑器里闪烁光标的夜晚。这段过程大概可以分成三个阶段。3.1 前两周的热恋期数组、双指针、简单题带来的虚假繁荣刷题的头两周体验其实相当好。我从 Hot 100 里最容易的标签开始哈希、数组、双指针。这类题目的共同点是不需要你发明一个算法只需要你熟练掌握一种套路。最简单的例子是两数之和。第一次提交通过的那一刻我激动得截图发了朋友圈。不是说这道题有多难而是那种原来力扣题也可以做出来的正反馈太强了。紧随其后的有效的括号、合并两个有序链表、移动零每道题都让我觉得自己离算法大神只差 100 道题的距离。现在回头看这就是典型的虚假繁荣。这些简单题本质上是在验证你已经会的东西而不是教你的东西。它们能让你获得成就感但不会让你的算法能力产生质变。真正的挑战——树的遍历变种、回溯的剪枝、动态规划的状态推导——还安静地躲在 Hot 100 的中后段等着给我当头一棒。3.2 第一次心态波动动态规划的我懂了陷阱大约刷到第 25 题左右我开始遇到动态规划。这也是我整个刷题过程中第一个真正意义上的坎。当时遇到的是爬楼梯的变种和打家劫舍。这两道题在动态规划里已经算温和的了。我照着题解写写出了状态转移方程这几个字那一刻我真的觉得自己懂了。状态转移方程就是这个啊把大问题拆成小问题用之前的答案推导现在的答案逻辑通顺代码简洁运行效率高。我还专门做了笔记画了图把每一步都整理得清清楚楚。然后我合上笔记关掉题解重新打开一个新的动态规划题目——完全不会。问题出在我在阅读题解的时候以为自己是在理解算法。实际上我只是在顺着别人的思路走了一遍。动态规划最核心的能力是从零推导出状态定义和转移方程这个能力我没练过。我看懂了别人的推导过程不代表我自己面对一个新问题能够完成这种推导。这种感觉就像你看完了一百个魔术解密视频觉得自己已经是魔术大师了但上台表演的时候手还是抖的。我对动态规划题产生了畏惧心理越畏惧越不想碰越不碰就越生疏形成了一个负循环。3.3 终极崩溃现场三维接雨水是怎么把我劝退的如果有什么题目可以称为我这次刷题之路的终点站那一定是三维接雨水力扣 407 题Trapping Rain Water II。这道题在热门题目里讨论度一直很高不少分享帖把它列为尽力而为不会也正常的难度。先说说这道题让人崩溃的点。二维版本的接雨水第 42 题你面对的是一个一维数组只需要思考每个位置能接多少水经典的左右最大值取较小值思路就能搞定双指针 O(n) 遍历一遍空间 O(1)简洁优美。但三维版完全不是一个量级你面对的是一个二维矩阵每个格子有自己的高度雨水可以从上下左右四个方向流动最外圈不能蓄水但内部的凹坑能蓄多少水取决于它四周所有方向上最低的缺口。我第一次看到这道题的时候盯着题目描述看了十分钟脑子里一片空白。我知道这题要用优先队列Java 里的 PriorityQueue 也隐约知道反向思路是从边界向内收紧——但问题是为什么要从边界开始为什么每次要弹出最小高度的格子弹出的格子高度和蓄水量到底是什么关系我把题解反复读了三遍每句话都认识放在一起就是理解不了。那天晚上我做了个决定先跳过明天再看。第二天还是不会。第三天我花了整整三个小时像小学生抄写课文一样把别人的解法一行一行敲进编辑器提交通过。但我清楚我只是用 Java 复述了一遍别人的思路。如果面试官让我在白板上手写这道题我绝对写不出来。这种做了等于没做的挫败感是我最终决定踩下刹车、承认这个项目需要重构的直接原因。4. 复盘我踩过的坑希望你一个都别踩项目停了之后我没有立刻放弃而是花了几天时间把自己从决定刷题第一天开始的所有经历做了一次完整复盘。三个层面的问题看得清清楚楚。4.1 计划层面的三大误区第一大误区是用理想速度计算真实工期。我原计划 60 天完成 Hot 100 第一遍但真实推进中简单题可能 20 分钟就过中等题平均要 1 到 2 小时难题可能会耗掉一整个晚上甚至更久。正确的估算方式是先刷 10 道题统计自己的平均耗时用这个真实数据来计算总工期而不是用列表上的题目数量去乘一个幻想中的每天 2 道。第二大误区是没有给卡住留缓冲。刷题不像跑步今天的 5 公里跑完了就是跑完了。刷题存在一种极端情况一道题卡了两天进度停摆之前计划好的后续题目全部顺延。一旦出现顺延整个计划表就开始失去意义然后焦虑感开始累积。所以计划里必须内置卡题缓冲日比如每周留一天只做复习和重刷不安排新题。这个缓冲日不是可选的是必须的。第三大误区是把刷完等同于学会。我当时的目标是刷完 100 题这个目标本身就注定了翻车。刷题的正确目标应该是掌握 N 种算法思想并且在随机抽查时依然能独立解出题目。题目数量的指标太容易作弊了——抄题解、背代码、跳过不懂的难点都可以让数字增长但能力不会跟着增长。4.2 方法层面的五个致命错误第一个方法错误不复习就刷新题等于一边加水一边漏水。我当时刷到第 40 题的时候回头发现第 10 题的解法已经很模糊了。算法这东西遗忘曲线极其陡峭。正确做法是按 1 天、3 天、7 天、15 天的间隔反复复习已经做过的题并且复习时要求自己不看题解独立完成。第二个方法错误只做新题不做总结。我前 30 题的笔记本质上是题解代码的搬运工。我没有总结过双指针类题目的共同特征回溯算法的通用模板动态规划的思考步骤。没有这些总结我刷的题就是一座座孤岛无法形成迁移能力。第三个方法错误死磕难题挫败感吞噬信心。三维接雨水这种 Hard 题应该学会战略性放弃或者看懂题解后过几天再独立重写而不是当场死磕。死磕的唯一结果就是浪费大量时间并严重打击自信心。第四个方法错误频繁换题单永远在找最全攻略。刷到中途我因为焦虑开始刷各种力扣刷题攻略想找到一条更轻松的路径。结果就是浪费了很多时间在对比攻略、重新规划上实际刷题时间反而减少了。后来我才明白任何一份主流攻略都有可取之处选一个跟到底胜过反复横跳。第五个方法错误忽视语言本身的 API 熟练度。用 Java 刷题其实需要非常熟悉集合框架的各种边界行为比如 PriorityQueue 默认是小顶堆自定义比较器时要小心溢出HashMap 的 computeIfAbsent 能简化代码但用不好容易迷惑。我在刷题过程中不止一次因为 Java API 不熟而卡壳这其实也可以通过专项练习来补。4.3 心态层面的两个无解问题心态问题比方法问题更难解决。第一个是同辈压力。我的刷题群里永远有人一天刷 5 道题永远有人发三周刷完 200 题的经验贴。这种东西看多了真的会让人产生强烈的焦虑和自我怀疑。我现在想明白了别人的进度是别人的基础不同、时间不同、目标不同、语言不同根本没有可比性。刷题这件事上唯一的比较对象就是昨天的自己。第二个心态问题是完美主义后遗症。当我意识到自己无法按照原计划完美执行时我的第一反应不是调整计划而是产生了一种既然无法完美完成那就干脆不做了的逃避心态。这是很多人中途放弃的心理根源。应对方式只有一个在计划落地时就把不完美当成默认选项允许自己偶尔断档允许自己跳过难题允许自己在状态不好的时候只复习一道旧题。这些允许不是放纵而是对自己人性真相的尊重。5. 继承与重建崩殂之后我用这几个操作重新上桌如果这篇文章只是写我怎么放弃的那它顶多算一篇情绪日记。真正的价值在最后这一段项目崩了之后我做了什么调整以及如果你也准备刷力扣可以直接复制的路线。5.1 我做的第一个动作砍掉目标留下习惯中道崩殂的直接原因是项目本身承载了太多 KPI30 天完成多少题、多少天内二刷、每题都要独立想出来……我做的第一个调整是把这些目标全砍掉只保留一个最微小的动作每天打开力扣做一道题。题目难度不限哪怕只是做一道之前做过的简单题都算完成。这个调整的作用非常明显。因为任务足够小小到没有任何心理负担所以几乎不会找借口偷懒。我保持了每天做题的节奏虽然整体进度大大放慢了但这个节奏本身就是最大的成果。等到节奏稳定之后系统会给你一种惯性你再想进阶加量就顺理成章了。5.2 第二个动作按专题刷而不是按题目编号刷之前我几乎是按照 Hot 100 默认排列顺序来刷一会儿链表一会儿动态规划知识结构散成一片。重启之后我把方式改成按专题推进这个星期只做双指针下个星期只做二叉树做完一个专题就总结一个专题的通用模板。这个改动的价值太大了。当一个专题的题目集中出现时你会发现它们背后的套路高度相似。就像双指针核心无非是左右指针从两端向中间逼近或快慢指针从头同步前进你连续做十道双指针题自然就形成肌肉记忆了。按专题刷其实是在帮你建立一个又一个清晰的知识模块而不是让知识点杂乱地散落在你的大脑里。5.3 第三个动作把题解阅读升级为独立复现这是我在复盘阶段最受益的一个改变。以前看题解是看了之后点头觉得好有道理。重启之后我给自己立了一条铁律题解只看思路不看代码。看完思路之后合上题解自己在编辑器里独立把代码写出来。写不出来就再看思路再合上直到能独立写出来为止。这个过程的体验完全不一样。当你被迫从零开始组织逻辑时你才会真正暴露出自己理解上的盲区。你以为自己懂了用栈维护一个单调递减序列但动手写的时候你才会发现你根本不知道栈里应该存下标还是存值、什么时候 pop、什么时候计算面积。独立复现有个残酷又有效的检验标准关闭所有参考打开一个新窗口如果你能完整写出来并且提交通过你才勉强算是见过了这道题。5.4 给新手的最终忠告接受中道崩殂也是项目的一部分最后说点掏心窝子的话。如果你正在刷力扣或者准备开始刷我的建议不是你一定要坚持到底而是允许自己的进度不如预期。刷题本质上是长期主义者的游戏短期的崩殂不是失败它只是你在探索边界的时候撞到了一面墙。墙没有错你也没有错错的是那个以为只要撞墙就能穿过去的计划。我个人更倾向的做法是每刷 20 道题就做一次阶段性复盘看看哪些类型的题让你耗时最多、哪些知识模块你始终没有建立起来。如果发现某个专题让你反复崩溃就大方地把它标记为暂缓攻坚先并行推进其他更顺手的内容。等你的信心池子蓄满了再回头啃硬骨头胜率会高很多。我现在依然保持着每天刷题的节奏但心态已经完全变了——不再为了赶进度也不再追求所有题我都会。对我这个业务开发出身的人来说刷力扣最大的意义是在不断解决抽象问题的过程中保持思维灵活度。至于 Hot 100 有没有刷完说实话已经不重要了。重要的是我还在刷并且这一次不会再崩了。
返回列表