ARTICLE DETAIL

资讯详情

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

从多刷到刷透:100道算法题的三个月复盘与方法论

从多刷到刷透:100道算法题的三个月复盘与方法论 去年我给自己定了一个看起来不够“卷”的目标只刷100道算法题。当时身边不少朋友已经在刷第三轮300题了我反而砍掉了题量把目标从“多刷”改成“刷透”。现在回头看这100道题带来的效果比之前零散刷过的两百道都好还顺手治好了我多年的老毛病——看到题先翻题解。这篇文章就是我这三个月刷题项目的完整复盘。不是讲“每天打卡100天”这种鸡汤而是把选题逻辑、时间排期、复盘方法、踩过的坑都摊开来讲。如果你也在准备算法面试或者觉得自己刷了不少题但遇到变形题就发怵那这篇文章应该能帮你少走很多弯路。1. 为什么是100道题从“刷得多”到“刷得透”1.1 我最初的困境数量上去了信心没上去先说下背景。我当时的水平大概处于“能写简单题中等题看运气难题直接放弃”的阶段。LeetCode也好其他在线判题系统也好陆陆续续刷了两百多题但心里始终没有底。最长的一次连续刷题坚持了快四个月每天下班回来做一两道做完一看题解觉得“懂了”关掉页面第二天全忘光。问题出在哪我后来总结就一句话我一直在“做新题”从来没有“嚼烂题”。数量看起来很漂亮但每一道题的吸收率可能只有两成。遇到稍微变个花样的题比如二叉树换成多叉树双指针换到矩阵里立刻卡壳。所以这次我给自己立了个规矩题目数量降到100道但每一道都必须做到能独立写出来、能讲清楚思路、能应对题目变形。宁可一道题做三遍也不做三道各自只过一遍的题。1.2 100道题的目标锚点覆盖面、熟练度、可复现为什么是100不是50也不是300这取决于我的目标和可用时间。如果目标是面试尤其是国内大厂和部分外企的算法面试考点是有边界的。基础数据结构数组、链表、栈、队列、哈希表、树、堆、基础算法排序、二分、双指针、滑动窗口、回溯、动态规划、贪心、图翻来覆去就是这些模型。按照每个专题8-15道题的密度100道题恰好能把主流考点完整覆盖一遍。我把100道题拆成了三个目标锚点覆盖面每个高频专题至少过一遍不给自己留“这个没看过”的盲区熟练度核心题能做到15分钟内想出思路、40分钟内写完且一次运行通过可复现一周后、一个月后回到这道题还能独立写出完整解而不是靠记忆背答案这三个锚点随便拿一个出来都比单纯“刷了100题”这个指标更有意义。后来我复盘整段经历时发现真正区分刷题有效无效的就是后面这两个锚点有没有达成。1.3 预算倒推100道题到底需要多少时间刷题这事最大的幻觉是“我今天下班后刷两小时”。两小时看起来不少但其中一半时间在发呆、翻题解、摆弄测试用例。我做了个简单预算一道题平均投入2小时含思考、写码、复盘100道题就是200小时。按每天工作日1.5小时、周末5小时来算一周约16.5小时三个月约200小时刚好卡着预算。这说明一个重要的道理三个月完成100题靠的不是某一两天打了鸡血而是持续稳定的投入。排期必须松到能坚持、紧到有进度不然一定烂尾。这个预算也直接影响了我后面的专题选择和每日任务量。每天我最多安排新题1道第二个月后增加到每天1道新题加1道复习周末集中复盘。一天的净投入基本控制在两小时内不会影响正常工作生活。2. 选题地图100道题怎么分配到各个考点2.1 专题池与配比面试频率决定权重选题之前先定配比。我的原则很简单面试基本必考的专题多分配冷门偏怪的专题少分配甚至不分配。这里有一个容易犯的错误——按“自己擅不擅长”来分配结果越会的越刷、越不会的越躲最后等于没补短板。我的专题配比见表专题题数面试出镜率我的基础说明数组与哈希表10极高一般打底专题很多题的基础工具双指针与滑动窗口8极高较弱高频且套路化性价比极高链表8高一般翻转、快慢指针、合并系列栈与队列7中高一般单调栈是重点二叉树与递归12极高较弱面试必考值得投入最多堆与优先队列6高较弱TopK问题几乎必考二分查找6高中等偏弱边界条件必须亲手踩过回溯算法8高较弱排列组合子集题是重点模型动态规划12极高较弱性价比最高的投入之一贪心算法5中高中等专题本身不难难在识别图与并查集8中弱连通性、拓扑排序、最短路字符串操作5中一般回文、子串、经典题为主面试模拟综合5--混合专题套题不限单一考点合计刚好100道。每个专题内部还要细分难度我参照的是一个1:3:1的简易模型——1道热身、3道核心、1道挑战后面细说。2.2 难度分层热身、核心、挑战的黄金比例很多人刷题挂在一个地方难度配比失衡。要么从头难到尾刷三天心态就崩了要么一路简单题刷得自信满满面试一道中等题直接现原形。我的方案是每个专题按**热身20%、核心60%、挑战20%**的比例选题。热身题的作用是建立对这个专题的基础手感。比如二叉树专题先做“求最大深度”“判断两棵树是否相同”这类递归入门题五分钟能写出来关键是熟悉“递归函数要返回什么”的思考方式。核心题这才进入该专题真正的面试区间比如二叉树的层序遍历、最近公共祖先、前序中序构造二叉树。挑战题是给学有余力的时间准备的比如动态规划里的编辑距离、股票买卖IV这类一是防止自己飘二是确保面试碰到难题也有心理准备。这个比例保证了每天的刷题体验是“有点压力但能扛住”而不是“天天崩溃”。整体算下来100道题里大约20道热身、60道核心、20道挑战和面试题目难度分布基本匹配。2.3 具体选题清单样例以二叉树和动态规划为例光说比例还是抽象我给两个专题的具体选题列表作为参考你可以拿着这个思路去建立自己的题库。二叉树与递归12道我选的是最大深度、判断平衡二叉树、翻转二叉树、前序/中序/后序遍历统一写成递归迭代各一遍、层序遍历、二叉树的所有路径、最近公共祖先、前序中序构造二叉树、二叉搜索树中第K小元素、路径总和III、验证二叉搜索树。动态规划12道我选的是爬楼梯、打家劫舍、最长递增子序列、完全平方数、零钱兑换、最长公共子序列、单词拆分、编辑距离、最长回文子串、最大子数组和、股票买卖含冷冻期、最小路径和。选完题顺手做了一件事把这些题按“专题”和“难度”整理成一个清单每题标注三个状态第一次独立做出没、是否复现过、能否口述思路。这张清单就是整个项目的进度仪表盘后面每道题的状态一目了然。3. 三个月的节奏设计怎么排期不会前松后紧3.1 三种阶段的划分打底期、交叉期、冲刺期100道题的周期如果拉得太长前面学的东西到后面已经忘光太短又不可能做到“吃透”。我卡在三个月正好分三个阶段阶段一是打底期第1-4周按专题顺序刷后半部分的“基础题”。这个阶段不追求速度目标是每个专题建立基本框架搞清楚这类题的套路是什么。我当时是周一数组哈希、周二双指针滑动窗口、周三链表、周四栈队列、周五二叉树周末做一次综合复习。每天新题1-2道但必须把前一天做过的题重新写一遍才能开始做新题。阶段二是交叉期第5-9周打乱专题顺序做题。这是很多刷题复盘容易忽略的一步——面试不会告诉你“这道题考的是动态规划”你需要从题干自己识别考点。交叉期的做法是今天做一道回溯、明天做一道堆、后天再来一道动态规划每道题都必须先答“这是什么题、用什么套路”强行训练题型识别能力。阶段三是冲刺期第10-13周以限时模拟为核心。每天严格按40-45分钟计时做题到点就停然后花同样时间复盘。每周找一晚做一套完整的模拟面试题2-3道模拟临场节奏。这个阶段新题只占三成七成时间用于高频题复现和错题重刷。3.2 每周排期模板工作日与周末的差异化用法我的周排期是这样的星期内容耗时周一至周四新题1道 昨日题复现约1.5小时周五本周新题整体复现约1小时周六旧题复习 口述思路3-5题约1.5小时周日限时套题1次 周复盘约2小时这套排期的核心用意是做到了“新题之后必复习”。周一到周四连做新题是最容易“刷了就忘”的时段周五专门把本周做过的新题全部复现一遍相当于第一轮保质周六复习更早之前的内容拉开复习间距周日限时模拟检验真实状态。3.3 用遗忘曲线安排复习周期我刷题时一直对着一组数据一道题做完当天能记住九成一周后只剩三成一个月后如果不碰基本归零。这个规律大家都有体感但很少有人专门为它设计复习机制。我的方案是针对每一道题建立四条复习线做完当天、第3天、第7天、第14天各复习一次。前两次是重写代码后两次可以是口述思路或直接看代码回忆关键逻辑。这样下来每道题至少过了三遍第一次是初做第二次是当天晚间的复现第三次是周度复现。到阶段三冲刺期核心题至少已经主动复现过四五遍上考场前心里是有底的。4. 吃透一道题我的四步复盘法4.1 第一步独立的30分钟拒绝一看题就翻题解这可能是整个100题计划里唯一称得上“纪律”的要求拿到一道题至少独立思考30分钟想不出来也不能中途看题解。为什么要这样因为面试时你面对的是未知题目没有任何题解可翻。平时习惯了“卡住就翻”到面试会变成一个灾难——大脑会默认“反正答案在某个地方”进而放弃主动思考。而主动思考的过程哪怕最后没想出来也会在你脑子里留下比看十遍题解都深的痕迹。我的做法是准备一个文档专门记录“卡点”。30分钟内如果毫无头绪就把“我卡在哪一步”写下来是没思路想到了用哈希表但不知道怎么处理重复想到了双指针但方向不对30分钟一到带着这些具体问题去翻题解效率完全不一样。4.2 第二步记录“卡点”而不是只写“做不出来”这一步是我认为整个方法里最有价值但很少有人做的事——给每道错题写“卡点记录”。“卡点”不是你做没做出来而是你在哪个地方被卡住了。这是完全不同的信息。比如说“我用暴力法做出来了但是超时”说明你会暴力解但不清楚复杂度的优化方向再比如“想到了用单调栈但不确定栈里存的是下标还是值”说明你的方向对卡在实现细节上。我把卡点按类型分成了四类思路卡完全没有方向不知道该用什么算法转换卡想到了算法但不知道怎么把题目条件转换成代码逻辑实现卡思路对但写代码时边界条件、指针移动、数组下标处理出问题复杂度卡能跑通但超时需要找更优解一周下来统计卡点分布你就知道自己的短板到底在哪。我个人的数据是“转换卡”最多说明我并不是不会算法而是把题目语言转成代码结构的能力不够。这个洞察直接帮我把精力调整到了更对症的方向上。4.3 第三步和最佳解法做差距分析很多人做完题、看完题解就关页面这是最可惜的一步。看完题解后的关键动作是追问为什么标准答案那么写而我没想到。以一道经典题“最长无重复字符子串”为例。我第一版写了暴力法两层循环枚举所有子串再用哈希集合判断是否有重复时间复杂度O(n^2)。看了题解发现用滑动窗口加哈希集合能在O(n)里解决。差距分析我做了三步第一步看解法理解它的运行过程手动模拟一遍第二步对照我的卡点记录发现我其实想到了滑动窗口但不确定移动窗口时该怎么维护状态所以退回到了暴力法第三步想想我的思路离标准解还差哪一步答案是我没有把“右指针移动窗口”和“左指针收缩窗口”这两个操作明确拆开。把每一步都写下来之后这道题才真正属于你了。第二天复现时我的大脑不再是一片空白而是能按照“扩窗口-发现重复-收缩窗口-更新答案”这四个阶段推着代码往前走。4.4 第四步限时复现与口述讲解复现不是把代码重新敲一遍而是模拟面试状态开着计时器40分钟内从零开始写完然后对着一个假想的面试官把“为什么这么想、复杂度是多少、边界怎么处理”讲出来。讲出来这一步特别重要。因为写作代码时有些模糊的理解会被函数的调用关系掩盖过去但一开口讲你哪里理解得不透瞬间暴露。我做过统计前两周口述的时候我至少有七成的题是“写得出代码但是讲不清为什么”。这其实是没真正吃透信号。后来我给自己定了一个标准如果一道题我说不出来“它考什么、用什么方法、为什么这个方法有效、边界在哪”那这道题就不算完成。这四条说明白了才在清单里把状态改成“通过”。4.5 一个复盘模板示例我用的复盘模板长这样你可以直接抄走字段内容题目与专题题目名称、所属专题、难度首次答题状态做出/部分做出/没做出、耗时卡点类型思路卡/转换卡/实现卡/复杂度卡卡点描述具体卡在哪如“想到了双指针但不知道右侧指针怎么动”最优解思路用自己的话写一遍标准解法不超过五行与我的解法差距差在哪一步如“没有意识到滑窗移动左右指针的顺序”边界与易错点空输入、重复元素、负数、越界等复现结果当天复现/3天复现/7天复现是否正确口述结果能否讲清楚四要素每道题我花在这个模板上的时间是20-30分钟看起来比做题还久但这才是真正吃透题目的部分。我给这次项目起名“100题-”后缀是“吃透”而不是“刷完”区别就在这里。5. 执行期踩过的坑能绕开就别硬踩5.1 最大的坑只刷新题从不复习这个坑我前两百题就是栽在这里的。当时的做法是每天固定做一道新题做完了打个勾第二天就抛在脑后。结果一个多月后回头发现前面做的题百分之八十写不出来。那种挫败感远大于做出一道难题的兴奋感。后来我把刷题逻辑彻底改成了“复习优先于新题”。每天坐下来先花15-20分钟复现之前的题复现通过了才有资格做新题。这个改动让进度看起来变慢但两周之后就发现了质变——之前卡住我的很多题第二次写其实很快真正要新算的也就是那几步。如果你也在刷题我建议你从第一天开始就建一个“当日复习”清单每天固定至少取出三道旧题重写或口述否则三个月过去你会发现自己一直在原地踏步。5.2 隐形的坑从来不限时我在阶段一打底期没有限时理由是“先想清楚再追求速度”。这个决定前期是对的但问题出在我迟迟没切换到限时模式。到了第二个月我还是习惯性地在一道题上磨磨蹭蹭四十分钟以上自己还觉得挺认真。直到有一次我做了一道中等难度的题聊天记录里显示我从开始到提交整整花了55分钟我才意识到问题的严重性。面试的标配时间是30-45分钟一道题55分钟意味着我连正常完成都做不到更别说留出时间讨论和优化。阶段二开始我强制限时新题最多45分钟到点必须停下来无论做成什么样直接进入复盘。这个习惯养起来之后做题的“节奏感”完全不同——你不会在某个边界条件上死磕十分钟而是先跑通主逻辑再回来补边角。这才是面试真正的状态。5.3 情绪上的坑难度配比失衡导致厌题进度到第六周的时候我经历了一次刷题以来最强的倦怠期。那段时间我连续几天选了难题结果一天的心情都变得很差晚上完全不想打开编辑器。回过头来想其实不是题太难而是那几天“难题密度”过高把刷题变成了连续失败的过程。应对方式就是在排期里做硬性规定每天最多一道挑战题完成一整天的高强度难题后第二天必须做一道热身题“奖励”自己。这个做法听起来很基础但它确实帮我把刷题这个行为从“自我惩罚”变成了“有正反馈的长期任务”。事实证明刷题是需要能量管理的情绪价值同样重要。5.4 纪律上的坑只“想一想”不运行我有一段时间做题容易走捷径看了道题手写一下关键逻辑觉得“哦这个我知道怎么写”然后就跳过了。结果一到限时场景手指在键盘上悬着却一个字都打不出来。后来我把“必须能运行”立为铁律。每一道新题不管看起来多简单都要写完整代码并在本地或在线环境跑通测试用例哪怕只是简单的手写测试。这个习惯有效过滤了“我以为我会了”的假象。5.5 阶段自检清单在项目的第4周、第8周、第12周我各做了一次阶段性自检防止自己骗自己。自检清单如下随机抽10道已经标为“通过”的题限时40分钟重写通过率是否达到70%每道题能不能在15秒内说出它的主要解法与复杂度卡点记录里“转换卡”的比例是否在下降最近两周有没有做过限时套题结果如何随手翻开一题早期做过的题能不能不看题解独立写完这套清单不比刷题本身轻松但答案是骗不了人的。第4周时我的随机重写通过率只有40%逼着我把整个节奏放缓复查了前几周的薄弱环节才在第三次自检时把通过率提上了80%。6. 百题之后的真实变化数据与面试表现6.1 统计维度与结果项目结束后我整理了整套数据这里挑几个核心指标指标数值计划完成率100/100其中1题临时替换原题设计有问题首次独立做出率38%复现通过率当天复现87%复现通过率14天后复现68%口述四要素通过率73%平均单题耗时阶段三约33分钟含复盘前段思考首次独立做出率只有38%说明三分之二的题第一次做不出来或者没完全做出来这个数据应该能让很多刷题自我怀疑的人松口气——做不出新题是正常的关键是你之后有没有把它啃透。14天复现通过率68%意味着大约三成题还是有水分但这部分恰恰成了后续复习的精准靶点。6.2 面试中出现的“变形题应对”能力变化刷完这100题之后我最大的感触不是“见过的题变多了”而是“没见过的题也不慌了”。有一次面试官出了一道题描述的是“给定一个二维网格每个格子可以走某些格子是障碍物求从左上到右下所有路径中翻转障碍物次数最少的那条”。这道题我百分之百没见过但我的第一反应是网格路径、权重不等、求最短路——这可以建模成图边权是0或1用0-1 BFS。虽然这道题没有出现在我之前100题的清单里但图专题做过的短路模型和双端队列技巧直接就能平移过来。这种“把没见过的问题翻译成见过程模型”的能力是完全靠积累题型模型练出来的。刷题的目的不是背下那100道题而是通过这100道题把每一个算法模型的触发条件、实现骨架、边界细节焊在脑子里。之后遇到什么新题你调用的不再是一道题的完整代码而是一套可以拼装的零件。6.3 这套方法还能扩展到哪里项目结束后我又把这套方法论复制到了两个场景一个是把100道题的核心模型整理成了一份两页纸的速查笔记把“什么时候用哪种算法”讲清楚作为面试前的紧急复习资料另一个是把这些题作为长期题库每隔一两个月随机抽几道复现防止滑坡。我也试着把这套“少而精”思路推荐给过几个刚开始刷题的朋友。有人成功有人还是喜欢海量刷题那种安全感。我个人的体会是刷题方式没有唯一正解但如果你和当初的我一样——有过“刷了很多题却依然没底气”的困惑——那不妨砍掉一半题量把剩下的每一道都嚼烂了再咽下去。至少对我而言100道“吃透”的题远比400道“做过”的题更能扛住面试这场硬仗。
返回列表