ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

剑指Offer 75题算法分类与31天刷题路线图

剑指Offer 75题算法分类与31天刷题路线图 1. 先把题单和日历拆开看75 题分类与 31 天路线图到底解决什么问题刷题这件事最怕两件事一是不知道刷什么二是知道刷什么但排不出时间。很多人的状态是收藏夹里存了几十份题单真正动手的那份还是三年前的。剑指 Offer 这套题一共 75 道题目质量确实高覆盖面和面试贴合度都不错但它有个天然的门槛——题号顺序是按“出题顺序”排的不是按“学习顺序”排的。你从第一题顺着往下做会在数组、字符串、链表、树、DP 之间来回横跳每跳一次都要重新热身效率很低。所以75 题算法分类的意义不是把题分个类好看而是把“同一套思维模型”的题压在一起让你在做第 3 道题的时候第 1 道题的手感还在。而31 天刷题路线图解决的是另一个维度的问题分类解决“怎么学”路线图解决“什么时候学、学多少、什么时候回头”。这两件事必须一起设计只分类不排期大概率变成前三天猛刷二十题、后面彻底摆烂只排期不分类就是每天机械打卡做题全凭运气。我这套方案的适用人群很明确有一点编程基础能看懂数组和链表但面对中等难度题容易卡壳或者刷过几十道题但不成体系面试前想快速把高频题过一遍。完全零基础的人也能跟但前两天会稍微吃力需要额外补一下复杂度分析和递归的基本概念。整篇内容我会把每一类题在考什么、路线图每一天做多少、每道题做到什么程度算过关全部摊开讲你可以直接拿去改日期抄作业。2. 75 题算法分类的底层依据按思维模型分组而不是按数据结构2.1 为什么“按数据结构分类”不够用大部分人第一次分类会按数据结构来数组一类、链表一类、树一类、图一类。这个分法直观但实际用起来会发现一个问题——同一类数据结构里思维方式可能完全不同。比如数组题里有的是双指针往中间夹有的是原地覆盖写有的是前缀和预处理还有的是二分查找这四种思路之间几乎没有迁移性。你连着做五道数组题可能前三道用双指针很顺第四道是二分手感立刻断掉。所以我采用的是“数据结构 思维模型”的双层分类。第一层保证你不至于在完全陌生的领域里硬碰第二层保证同一组题用的是同一套脑回路。75 道题分下来大概是这么个结构分类层级覆盖题型题量占比核心思维模型数组与字符串查找、替换、原地修改、子串约 18%双指针、原地写、滑动窗口链表反转、合并、删除、环、复制约 14%指针重连、快慢指针、哑节点栈与队列单调栈、辅助栈、滑动窗口最值约 9%后进先出、单调性维护树遍历、重建、子结构、路径约 17%递归定义、返回值语义查找与排序二分变体、TopK、归并约 12%区间收缩、分治动态规划线性 DP、区间 DP、计数 DP约 16%状态定义、转移方程、初始化回溯与搜索排列、组合、矩阵路径约 8%选择与撤销、剪枝位运算与数学计数、快速幂、进制约 6%位运算性质、数学推导这张表你可以直接当目录用。占比不是随便写的它对应的是面试出题频率的大致分布——数组字符串和树加起来超过三分之一这两块练不透其他部分再熟也撑不住场面。2.2 分类之后必须做的事给每类找一道“母题”分类只是第一步。真正让分类产生价值的是每一类里挑一道母题把它的解法吃到能默写的程度。母题的作用相当于一个模板库的入口后面遇到同类题你只需要判断“它和母题差在哪”而不是从零开始想。举几个我自己的母题选择数组类的母题是“二维数组中的查找”——它把“有序性如何转化为指针移动规则”这件事讲透了后面做旋转数组、矩阵置零都能套这个思路。链表类的母题是“反转链表”——指针重连的三行代码是所有链表操作的地基合并、分组反转、回文判断全是它的变体。树类的母题是“二叉树的镜像”——递归的返回值语义、左右子树交换的顺序这一道讲清楚了后面重建二叉树、判断子结构都不会乱。DP 类的母题是“连续子数组的最大和”——状态定义、初始化、转移、边界四个要素齐全而且短五分钟能默写一遍。母题选完之后每类题的第一道必须是母题而且要求做到不看书、不看提示、一次写对。做不到就重来不要往下走。这个要求听起来苛刻但它省掉的是后面几十道题的反复卡壳时间。提示母题不是“最简单的题”而是“最能代表这类题思维骨架的题”。简单题未必有代表性有些简单题只是边界情况多思维含量低选它当母题反而浪费时间。2.3 分类里容易踩的坑把“相似解法”当成“同一类”有个坑我踩过不止一次看到两道题都能用双指针做就把它们归成一类结果复习的时候一起复习考试的时候一起想不起来。原因是它们的双指针目的不同——有的是为了缩小搜索区间有的是为了维护窗口内某种性质有的是为了原地写覆盖读指针。判断两道题是不是真的一类我有个笨办法合上题解用一句话说清楚“这道题的第一步决策是什么”。如果两题的第一步决策是同一句话比如“先固定左端点右端点单调右移”那它们是一类如果一句话说不清或者两题的第一步是不同的话那它们只是“解法看起来像”不该放在一起练。这个判断标准比看标签靠谱得多因为标签是别人打的决策是你自己做出来的。3. 31 天路线图的具体排布每天做多少、做什么、留多少缓冲3.1 排期的三个硬约束和对应的参数计算排路线图不能凭感觉说“每天两道题”得先算清楚三个约束。第一个约束是总量。75 道题31 天平均每天 2.42 道。但新题不能天天满负荷必须留复习位所以真实的分配是新题总量约 62 道复习位约 13 天次。剩下的十几道题放在最后几天的套卷和错题回炉里不算新题。第二个约束是单题耗时。我实测下来的时间分布是这样的一道没见过的中等题从读题到写完并自测通过45 到 60 分钟是常态其中读题和理解 5 到 10 分钟、独立思考 10 到 15 分钟、编码 20 分钟、对照题解和修正 10 到 15 分钟。如果卡住了硬扛的上限是 30 分钟超过就去看题解不要死磕。复习一道做过的题15 到 20 分钟。第三个约束是精力曲线。工作日晚上能稳定拿出 2 小时已经很不错周末能拿出 4 小时。所以排期必须做成“工作日轻、周末重”的节奏而不是每天平均切。按这三个约束算下来一个可执行的日课表是这样时段类型新题量复习量预估耗时工作日约 20 天2 道1 道100 到 120 分钟周末约 8 天3 到 4 道2 道200 到 240 分钟收尾阶段3 天0 道错题全量每天 90 分钟62 道新题怎么落到这 28 天里工作日 20 天 × 2 道 40 道周末 8 天 × 平均 2.75 道 ≈ 22 道合计 62 道。剩下 13 道题分布在最后三天的错题回炉和套卷里其中一部分是你第一遍没做出来的题正好借这个机会补上。3.2 逐周拆解从基础结构到综合套卷第 1 周Day 1 到 Day 7数组、字符串、链表。这一周的目标不是做对多少题而是把“边界条件”这个习惯建立起来。数组题最常见的错是空数组、单元素、全相同元素链表题最常见的错是空链表、单节点、断链。这一周每天的新题里至少要有一道是“看起来很简单但边界很坑”的题逼自己养成写完先手推三组测试数据的习惯。这一周的具体安排Day 1 到 Day 3 做数组与字符串母题 原地修改 双指针 滑动窗口Day 4 到 Day 5 做链表基础反转、合并、删除、倒数第 kDay 6 做链表的进阶环、复制复杂链表、两个链表第一个公共节点Day 7 全天复盘把这一周所有做错的题重写一遍不写新题。第 2 周Day 8 到 Day 14栈队列 树。这一周是整个路线图里最陡的一段因为树的递归思维对很多人来说是第一次真正意义上的“思维转换”。我的建议是 Day 8 到 Day 9 先把栈队列解决掉两个栈实现队列、包含 min 的栈、栈的压入弹出序列、滑动窗口最大值Day 10 到 Day 13 全部给树Day 14 复盘。树的四天要按顺序来先遍历前中后序、层序再重建前序中序重建、后序中序重建再性质镜像、对称、子结构、平衡最后路径与二叉搜索树路径和、BST 转双向链表、BST 第 k 大。这个顺序不能乱因为后一步全是前一步的复用。第 3 周Day 15 到 Day 21查找排序 动态规划 回溯。这一周的关键词是“模板”。二分查找要整理出至少三个变体模板找目标、找左边界、找右边界DP 要整理出状态定义的四要素模板回溯要整理出“选择—递归—撤销”的三行骨架。Day 15 到 Day 16 做查找排序二分变体、TopK、归并、快速选择Day 17 到 Day 19 做 DPDay 20 到 Day 21 做回溯。DP 这三天一定要按难度递增排先线性 DP斐波那契类、跳台阶、连续子数组最大和再二维 DP礼物的最大价值、最长不含重复字符子串最后计数类 DP丑数、n 个骰子的点数。二维 DP 放到第二段是因为它需要先有“状态是二维的”这个直觉一上来就做容易懵。第 4 周Day 22 到 Day 28位运算数学 综合套卷。Day 22 到 Day 23 处理位运算和数学二进制中 1 的个数、数值的整数次方、1 到 n 整数中 1 出现的次数、数组中出现次数超过一半的数字这类题量少但思维跳跃大单独放两天比较合适。Day 24 到 Day 28 进入套卷模式每天随机抽 5 道题限时 90 分钟模拟真实面试的手感做完立刻复盘。收尾三天Day 29 到 Day 31错题回炉 模拟面试。这三天不碰新题。Day 29 把整份错题本过一遍只做第一遍没做出来的那些Day 30 挑 8 道高频题做口头讲解对着空气讲思路讲不顺的就是没真懂Day 31 整套模拟随机 3 道题白板写限时 45 分钟。3.3 复习位怎么插固定间隔比“想起来就复习”靠谱复习位的插入规则我用的是固定间隔做完一道新题的当天晚上、第 3 天、第 7 天、第 15 天各复习一次。听起来很麻烦实际上操作很简单——每天开始新题之前先看看“今天该复习哪些”把该复习的题号列出来花 20 分钟过一遍再开始新题。这个间隔不是我拍的它对应的是遗忘曲线里几个比较关键的衰减点。第 1 天复习是为了趁记忆还热的时候加固编码细节第 3 天复习是为了对抗第一次明显遗忘第 7 天和第 15 天是两次长间隔主要检验“思路还在不在”。实际操作中你会发现第 15 天那次复习最痛苦很多题你已经完全忘了当时怎么想的。这恰恰是它有价值的地方——如果第 15 天你还能独立写出来这道题基本就进入长期记忆了。写不出来也不用慌标记为“重点错题”进最后的错题回炉名单。注意复习不是“重看一遍题解”而是“合上一切从空白开始写”。看题解产生的熟悉感是假的只有手能写出来才算数。4. 每道题做到什么程度算过关三遍刷题法和笔记模板4.1 三遍刷题法每一遍的目标完全不同很多人刷题效率低是因为把“做过”当成了“会了”。我的做法是每道题强制过三遍每遍的目标不一样。第一遍理解优先允许看题解。独立思考 20 到 30 分钟卡住就看题解看完之后合上题解自己重写一遍。这一遍的目标是搞清楚“这道题的解法为什么成立”不是记住代码。写完要在笔记里写一句话总结核心思路比如“先固定左边界右边界单调右移窗口内维护不重复字符集合”。第二遍脱离题解限时完成。在第一遍之后的第 3 天左右进行要求完全不看任何提示25 分钟内写完并自测通过。写不出来就说明第一遍其实没懂回到第一遍重来。这一遍的目标是“能独立复现”。第三遍限时压缩模拟压力。在第 7 天或第 15 天进行要求在 15 分钟内写完边写边口述思路。这一遍的目标是“在紧张状态下还能写对”因为面试现场就是有压力的平时写得出、现场写不出的人非常多。三遍都过的题标记为“已掌握”后续只在套卷里随机抽到才做。三遍里任何一遍没过进错题本按错题本的节奏走。4.2 题解笔记的固定模板五栏多一栏都嫌多笔记记得太详细复习的时候会忍不住通读反而浪费时间记得太简略复习的时候看不懂自己在写什么。我用的是固定五栏每道题控制在半页以内栏目写什么示例一句话思路第一步决策 核心不变式快慢指针快指针先走 k 步然后同步走关键边界这道题特有、容易漏的情况链表长度小于 k 时返回空复杂度时间、空间写清楚为什么时间 O(n)每个节点访问两次空间 O(1)踩坑记录自己第一次写错在哪快指针先走时没判空导致空指针异常同类迁移这道题的思路还能用在哪些题上可用于判断环、找中点、找倒数第 k第三栏“复杂度”很多人会跳过觉得写个 O(n) 就够了。实际上把“为什么是 O(n)”写清楚是检验自己有没有真正理解循环结构的唯一办法。比如快慢指针那道题如果你写不出“每个节点最多被访问两次所以是线性”说明你对指针移动次数的判断还是模糊的。4.3 测试数据的构造习惯写完先手推三组这一条我要单独拎出来讲因为它是拉开差距的地方。大部分人写完代码就直接提交跑通了就过跑不通就瞎改。正确的做法是写完先自己构造三组数据手推第一组用最小规模空输入、单元素、两个元素专门用来撞边界第二组用常规规模五到八个元素验证主流程第三组用特殊结构全相同元素、已排序、逆序、有重复值专门用来撞那些“看起来对但实际错”的逻辑。链表题的手推尤其重要因为链表在纸上画出来和脑子里想完全是两回事。我的习惯是每次写链表题先在纸上画三个节点标上指针然后按代码一行一行挪指针看有没有断链。这个动作花两分钟能省掉后面二十分钟的调试。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 高频卡点速查表下面这张表是我自己踩过、也见别人踩过的高频问题按出现频率排序。遇到卡住的时候先扫一遍很多时候问题就在里面。现象最可能的原因排查动作本地跑通提交报错边界输入没覆盖补测空输入、单元素、极值结果差一位循环终止条件写错把和逐个核对画出区间链表题结果少一个节点断链或漏接尾部在纸上画出指针变化检查最后一步递归题栈溢出递归深度过大或缺少终止条件检查终止条件是否覆盖所有分支DP 结果偏大或偏小初始化或转移方向错手推前三个状态看是否符合预期二分查找死循环区间收缩方式不统一固定一种区间写法不要中途换字符串题结果乱码原地修改时覆盖了未读部分检查读写指针的先后顺序回溯结果重复没做去重或选择顺序乱排序后加同层去重判断这张表里最值得说的是“二分查找死循环”因为它太常见了。根因几乎永远是区间定义不统一一会儿用左闭右闭一会儿用左闭右开收缩的时候left mid和left mid 1混着用必然死循环。解决办法很土但有效——整份代码只允许用一种区间写法写之前先在注释里写明是左闭右闭还是左闭右开写完对照注释检查每一处收缩。5.2 时间不够用怎么办三条降级策略31 天听着长实际执行起来一定会有断档。加班、生病、临时有事断个两三天太正常了。这时候不要想着“补回来”补不回来的硬补只会导致后面全部崩盘。我用的是三条降级策略按优先级排第一条砍新题不砍复习。时间紧张的时候宁可今天不做新题也要把该复习的复习完。因为新题是增量复习是保值保值优先。第二条把大题拆成两半。一道题想 30 分钟没思路不要硬扛到 60 分钟直接看题解的前半段只看思路不看代码然后自己写。这样单题耗时能压到 30 分钟以内虽然理解深度打折但至少保持了节奏。第三条整周顺延但压缩收尾阶段。如果某一周整体崩了就把这一周的内容顺延到下一周同时把最后三天的收尾压缩成一天。套卷和模拟面试可以砍错题回炉不能砍因为错题才是你真正的薄弱点。有一点要提醒不要为了赶进度而跳过复盘日。第 7 天、第 14 天、第 21 天这三个复盘日看起来“没做新题好像亏了”实际上它们的价值比做三天新题还高。复盘日做的事情是把这一周的错误模式提炼出来比如“我这周所有链表题都错在没判空”这个发现能一次性修掉后面十几道题的同类错误。5.3 反复忘怎么办把“记不住”拆成三种情况“做完就忘”是这个路线图里被问得最多的问题。我的观察是它其实是三种不同的问题处理方式完全不一样。第一种是编码细节忘。思路记得但边界怎么写、循环怎么起忘了。这种情况不用重做整道题只需要默写核心代码段三到五行两分钟一遍。比如快慢指针的循环骨架、二分的区间收缩两行、DP 的初始化三行这些是肌肉记忆靠高频短练解决。第二种是思路忘。看到题完全想不起从哪下手。这种情况说明第一遍就没真懂必须回到第一遍重做而且要看当时写的“一句话思路”对照着重新推一遍。如果推完还是模糊说明这道题的母题没吃透回去重做母题。第三种是同类题迁移不了。母题会做变体不会。这种情况最容易被误判成“记性差”实际上是没有做过变体对比。解决办法是拿两道同类题放在一起只比较“它们的第一步决策差在哪”写成一两句话。比如“连续子数组最大和”和“乘积最大子数组”差别就在于后者需要同时维护最大值和最小值因为负数乘负数会翻正。这种对比做三五组迁移能力会明显上来。提示不要用“刷题数量”衡量进度。75 道题刷完三遍是 225 次有效练习刷一遍就过是 75 次这两者的差距不是三倍是十倍以上。5.4 面试现场的三条应急技巧最后分享几条真正在高压场景下用得上的东西都是我被坑出来的。第一条先讲暴力解再优化。拿到题不要闷头想最优解先用一句话把暴力解说出来“最直接的做法是两层循环枚举所有组合复杂度 O(n²)我先说这个保证有解然后再看能不能优化。”这句话的作用是给面试官一个“这个人有基本盘”的信号同时也给自己争取了思考时间。第二条写代码前先复述一遍输入输出和边界。比如“输入是一个可能为空的链表头节点输出是反转后的头节点如果输入为空我返回空”。这个动作看起来啰嗦但它能挡掉一半以上的边界错误而且面试官很吃这一套。第三条卡住的时候说出你在想什么。沉默是面试里最危险的状态。哪怕你只是在想“这个能不能用双指针”也要说出来。面试官不怕你想不出来怕的是不知道你在想什么没法给你提示。6. 路线图跑完之后的延伸方向31 天跑完 75 题只能算把地基打完。后面的延伸我一般建议两个方向按需选一个就行不要贪多。一个方向是往同类题库扩展。75 题里的每一类都能在更大的题库里找到同模型的变体比如树类做完之后去刷层序变体、路径变体DP 做完之后去刷区间 DP 和状态压缩。扩展的时候不要重新分类直接往已有的分类里塞塞不进去的说明是新模型单独记一笔。另一个方向是往表达能力上转。做题做多了会发现写得出和讲得清是两回事。我自己的练法是挑十道高频题每道题录一段三分钟的语音讲清楚思路、复杂度、边界然后回放听。听的时候重点听两个地方有没有卡顿有没有说“然后这里就……嗯……”。卡顿的地方就是理解不牢的地方回去补。这两个方向不用都做选一个跑两周效果比继续盲目刷新题明显得多。我当时是选的第一条因为手上还有面试要准备扩展题库的性价比更高如果是已经工作、想长期保持手感第二条更合适毕竟日常工作中讲清楚一个方案比写出一个算法更常用。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表