尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

算法岗笔试必看:映客春招B卷考点全解析(含KMP、堆排序、贪心与动态规划)

算法岗笔试必看:映客春招B卷考点全解析(含KMP、堆排序、贪心与动态规划) 我去年春招的时候投过映客的算法岗。说实话当时看到“映客2020春招算法B卷”这个题的时候心里是有点嘀咕的——一个直播平台算法笔试能考多深结果拿到卷子才发现这套题比我想象中扎实得多。它不是在考你背了几个模型而是实实在在地在筛“能不能理解算法本质、能不能把问题转化成代码”的人。这套B卷涉及的考点非常典型覆盖了字符串、图论、动态规划、贪心、机器学习基础几个大块几乎就是校招算法岗的一个标准样本。这篇文章我就按这套卷子的考察逻辑把它涉及的算法知识点拆开揉碎了讲一遍同时结合我当时的解题思路和后来复盘的心得给正在准备这类笔试的同学一份可以直接参考的路线。1. 这套B卷在考什么从题目模块看映客的考察逻辑先说结论映客这套B卷不是在难为你它是在用一套标准化的题目组合快速判断你这个人“有没有算法功底”“能不能写代码”“有没有基本的数据敏感度”。我当时拿到卷子整体扫了一遍发现题目模块其实是很有讲究的。整套卷子大致可以分成三块第一块是基础数据结构与经典算法。这块包括数组、链表、栈、队列、树、图的基本操作以及排序、查找、字符串匹配这些经典算法。B卷里出现的KMP算法、next数组的构造、快速幂、堆排序其实都属于这一块。为什么要考这些因为直播间有大量的实时互动场景比如弹幕过滤、敏感词匹配、礼物特效的碰撞检测这些功能落到代码层面底层全是字符串匹配和数据结构操作。你如果连KMP的next数组都理解不了那线上的关键词过滤模块出了问题你连排查的思路都没有。第二块是算法设计思想。贪心、动态规划、分治、回溯B卷里占了相当大的比重。尤其是贪心算法直播场景里太常用了比如CDN节点的流量调度、主播推荐位的分配、礼物打赏的抽成计算本质上都是在做“当前最优选择”。这套卷子把贪心和动态规划放在一起考其实是在考察你能不能分清楚“什么时候用贪心什么时候必须动态规划”这是很多新手最容易栽跟头的地方。第三块是机器学习与数据分析基础。虽然算法工程师分很多方向但映客这种业务导向的公司需要你懂基本的机器学习概念至少得知道什么是聚类、什么是分类、什么是过拟合以及怎么处理特征。卷子里涉及的聚类算法、KNN、决策树这些考点都是这个思路。所以你看这套卷子的模块设计其实很“业务导向”。它不是ACM竞赛卷不是在考你偏题怪题而是在模拟一个算法工程师日常工作中最常遇到的那几类问题。搞清楚这一点你准备笔试的思路就应该跟着调整不要死磕难题要把基础打扎实把常见算法的原理和代码模板吃透比什么都有用。2. 字符串与模式匹配KMP算法、next数组以及那一道“abacaba”的陷阱B卷里字符串这块最经典的一道题就是关于KMP算法的。题目大概是给一个模式串pabacaba让你求它的next数组。我印象特别深因为这道题里藏着一个很容易踩的坑next数组的定义到底是“最长相等前后缀的长度”还是“最长相等前后缀长度减一”。先说KMP算法的核心思想。KMP解决的问题是在一个文本串S中查找模式串P的出现位置。暴力匹配的时间复杂度是O(m*n)m是文本串长度n是模式串长度。KMP的核心优化是当匹配失败时模式串不是只右移一位而是根据已经匹配的前缀信息跳到下一个可能匹配的位置。这个跳转靠的就是next数组。next数组的构造通俗点讲就是“对于模式串的每个位置它前面的子串的最长相等前后缀长度”。比如“abacaba”我们逐个位置分析i0字符a前面没有子串规定next[0] -1或者0取决于你用的是哪种定义。i1字符b前缀子串是a最长相等前后缀长度为0。i2字符a前缀子串是aba和b不相等最长相等前后缀为0。i3字符c前缀子串是aba最长相等前后缀是a长度1。i4字符a前缀子串是abac没有相等的前后缀长度为0。i5字符b前缀子串是abaca最长相等前后缀是a长度1。i6字符a前缀子串是abacab最长相等前后缀是ab长度2。如果next[i]定义为“前i个字符组成的子串的最长相等前后缀长度”那next数组就是[-1, 0, 0, 1, 0, 1, 2]。如果定义为“不包含当前字符的最长相等前后缀长度”那结果又不一样。我当时在这道题上就吃过亏因为不同教材、不同博客的写法不一样。有的地方next[0] -1然后next[i]表示前i个字符的最长相等前后缀长度有的地方next[0] 0next[i]表示“当第i个字符匹配失败时模式串应该跳到哪个位置”。这两种定义在代码实现上有细微差别但核心逻辑是一样的。笔试的时候如果题目没有明确说明定义方式我建议按下标从0开始、next[0]-1、next[i]表示前i个字符最长相等前后缀长度的方式去写然后加个注释说明你的定义。实战里KMP用在哪儿弹幕系统里的违禁词过滤、敏感词替换、直播间标题的非法字符检测这些都是典型的字符串匹配场景。你不可能用Python的in操作符去做高并发的实时过滤性能扛不住。用KMP预编译好关键词的next数组匹配的时候直接复用才是正经做法。顺带提一句B卷里还出现过快速幂算法相关的题。快速幂就是计算a的b次方对mod取模时用二分的思想把O(b)降到O(log b)。核心代码就几行def fast_pow(a, b, mod): res 1 a a % mod while b 0: if b 1: res (res * a) % mod a (a * a) % mod b 1 return res快速幂在计算组合数、加密算法、概率DP里都有应用。笔试考这个说明他们比较看重这个基础功。3. 排序、堆和Top K问题为什么堆排序比快速排序更适合做排行榜B卷里排序算法占了不小比重冒泡排序C实现、堆排序、排序算法复杂度对比这些基本操作都有涉及。我重点说一下堆排序因为它在直播场景里的应用太典型了——排行榜。直播间里有个实时榜单显示当前礼物贡献值最高的用户Top 10。这个榜单每秒钟都在变化可能会有新的礼物进来需要实时更新。如果每次都用快速排序把所有用户重新排一遍时间复杂度O(n log n)n是用户数直播间高峰期几十万人每次都全量排序服务器撑不住。正确的做法是用一个大小为10的小顶堆来维护Top 10新来一条礼物记录如果它的值比堆顶元素大就替换堆顶并调整堆否则直接忽略。这样每次操作的时间复杂度是O(log k)k10几乎可以忽略不计。我在实际项目里做过类似的榜单当时用的是Python的heapq模块底层就是堆。但是笔试不会让你调库会直接让你手写堆排序。堆排序的核心操作有两个sift_down下沉和建堆。下面是我建议你背下来的模板def sift_down(arr, start, end): parent start child parent * 2 1 while child end: if child 1 end and arr[child] arr[child 1]: child 1 if arr[parent] arr[child]: arr[parent], arr[child] arr[child], arr[parent] parent child child parent * 2 1 else: break def heap_sort(arr): n len(arr) # 建堆 for i in range(n // 2 - 1, -1, -1): sift_down(arr, i, n - 1) # 逐个取出堆顶 for i in range(n - 1, 0, -1): arr[0], arr[i] arr[i], arr[0] sift_down(arr, 0, i - 1)注意这里实现的是大顶堆排序结果是升序。如果需要降序可以改sift_down里的比较符号或者用小顶堆。冒泡排序考得就简单多了主要看你是不是真的理解交换逻辑。虽然实际工作中几乎不会用冒泡但作为教学性质的题目它考察的是你对排序过程的掌控力。C实现大概长这样void bubbleSort(vectorint arr) { int n arr.size(); for (int i 0; i n - 1; i) { bool swapped false; for (int j 0; j n - i - 1; j) { if (arr[j] arr[j 1]) { swap(arr[j], arr[j 1]); swapped true; } } if (!swapped) break; // 优化如果没有发生交换说明已经有序 } }笔试的时候能想到加这个swapped标志位说明你对算法的理解不只是背代码这是加分项。4. 贪心算法与动态规划的分界线从一道区间调度题说起B卷的算法设计部分贪心和动态规划基本是绑定出现的。我印象里有一道区间调度题就是经典的“选择最多不重叠区间”问题用贪心可以完美解决。但如果你分不清贪心和DP的适用场景很容易在这类题上翻车。贪心算法的本质是“每一步都做当前看起来最优的选择不回头”。它的优点是效率高O(n)或O(n log n)不需要存储中间状态。缺点是一旦局部最优推不出全局最优结果就是错的。动态规划的本质是“把问题拆成重叠子问题用状态转移方程记录中间结果”。它的优点是能保证找到全局最优解缺点是状态设计复杂、空间和时间开销大。我总结了一个简单的判断方法如果这个问题具有“贪心选择性质”和“最优子结构”就适合用贪心如果只有“最优子结构”而局部最优不一定能导向全局最优那就必须用DP。举个例子。区间调度问题给出一组区间[start, end]选出尽量多的互不重叠的区间。贪心做法是按end升序排序然后依次选择“结束最早的区间”如果下一个区间的start大于等于前一个选中区间的end就选它。这个策略能保证选到最多区间。为什么因为结束得越早留给后面的区间越多这符合“局部最优导向全局最优”的特性。但是换个问题01背包问题。每件物品只能选一次总重量有限价值最大。如果你用贪心按“单位重量价值最高”的顺序选大概率得不到最优解。比如背包容量10物品A重量6价值12物品B重量5价值10物品C重量5价值10。按单位重量价值排序是A最大先选A剩下容量4什么都放不下总价值12。但最优解是选B和C价值20。这就是贪心失效的经典案例必须用DP。我当时的解题策略是拿到一道题先看限制条件。如果物品/任务数量很大比如10^5级别那基本排除DP大概率是贪心或二分答案。如果数量在几百到几千可以考虑O(n^2)的DP。动态规划的状态设计我是从“最后一步”反推的——考虑最后一个决策点需要知道哪些信息那个信息就是状态里需要维护的维度。5. 图论与路径规划Dijkstra、拓扑排序和面试中的高频变体B卷里图论部分考的是经典中的经典Dijkstra算法、拓扑排序、二分图相关的内容。我结合直播业务场景展开说下。Dijkstra算法解决的是“单源最短路径”问题就是从一个节点出发到其他所有节点的最短路径。它的前提是边的权重非负。算法的核心是“贪心BFS”每次从未访问节点中选一个距离源点最近的节点用它去松弛更新它邻居的距离。朴素的Dijkstra时间复杂度O(V^2)V是节点数用优先队列优化后是O((VE)logV)。下面是我用了很久的模板建议直接背import heapq def dijkstra(graph, start): n len(graph) dist [float(inf)] * n dist[start] 0 pq [(0, start)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in graph[u]: if dist[u] w dist[v]: dist[v] dist[u] w heapq.heappush(pq, (dist[v], v)) return dist注意这里有个小技巧if d dist[u]: continue。这行代码叫“懒惰删除”因为我们可能多次把同一个节点推入堆中弹出旧值时直接跳过避免用visited数组标记逻辑更简洁。Dijkstra在直播场景里的一个应用是“直播线路的智能调度”。用户分布在不同的地理位置要看同一个主播的直播视频流需要从主播端经过多个CDN节点转发到用户端。每个节点之间的传输延迟就是边权用户端到最近可用的CDN边缘节点的最短路径决定了用户看到的画面卡不卡。这类问题在边缘计算里非常常见。拓扑排序考的是有向无环图DAG的节点排序保证对于每条有向边u-vu排在v前面。典型应用是任务调度比如直播间的自动化审核流程用户开播 - 推流 - AI内容审核 - 转码 - 分发这几个环节有先后依赖关系拓扑排序可以用来判断哪些环节可以并行哪些必须等前一步完成。它的实现基于BFS和一个入度数组也叫Kahn算法。代码模板from collections import deque def topo_sort(graph, indegree): n len(graph) q deque([i for i in range(n) if indegree[i] 0]) result [] while q: u q.popleft() result.append(u) for v in graph[u]: indegree[v] - 1 if indegree[v] 0: q.append(v) if len(result) ! n: return None # 存在环 return result如果拓扑排序结果的长度不等于节点数说明图里有环这个细节是面试官很喜欢问的点。6. 机器学习与聚类考点KNN、K-Means和一道关于“算法应用能力”的题B卷里出现了一道我印象很深的题KNN算法的应用能力包括哪三个方面。我猜这是多选题而且很多人会在这里丢分因为平时都关注KNN的原理却忽略了它“能干什么”这个层面的总结。KNNK近邻算法核心思想是“物以类聚”——一个样本的类别由它最近的K个邻居投票决定。它的三个核心应用能力我是这样理解的第一分类能力。这是KNN最常见的用途。比如根据用户的观看时长、送礼频率、弹幕互动次数这几个特征判断这个用户是“活跃用户”还是“沉默用户”。把已有用户标注好新用户进来后找它最近的K个历史用户看多数属于哪一类就把它归到那一类。第二回归能力。KNN不只可以做分类也可以做回归。思路一样找最近的K个样本把它们的标签值取平均作为预测值。比如预测一个主播下一场直播的在线人数峰值可以找历史上和他类型、时段、流量来源相似的主播把他们的在线峰值取平均。第三异常检测能力。如果一个样本和它最近的K个邻居的距离都非常远那它很可能是一个异常点。在直播场景里可以通过KNN检测异常登录行为、刷量行为。比如一个用户的行为模式和历史数据里的绝大多数用户相差很大那就要留意是不是机器脚本在刷弹幕。K-Means算法也是B卷的常客。注意K-Means和KNN虽然名字像但完全不一样K-Means是无监督学习的聚类算法目标是自动把数据分成K簇KNN是有监督学习的分类/回归算法需要标注数据。K-Means的原理是随机初始化K个中心点然后反复执行两步——把每个样本分到最近的中心点所在的簇然后重新计算每个簇的中心即簇内样本的均值直到中心点不再变化。这里有个坑就是初始点的选择很影响最后的结果所以很多实现会用K-Means来初始化让初始中心尽量分散。我在做这道题的时候顺便把监督学习和无监督学习的区别、常见算法的搭配又重新梳理了一遍这部分在后面的算法面试环节基本是必问的。7. 从B卷看实践应用直播推荐系统里的算法组合拳笔试嘛不光是做题还要琢磨它这些题目背后对应的业务场景。我复盘这套B卷之后发现映客的算法岗主要在做的事情大概率集中在三块个性化推荐、内容理解图像/音频、实时风控。这三块业务需要的算法能力正好对应了B卷里的这些题目。第一块个性化推荐。直播间的推荐和短视频推荐逻辑类似核心是用户画像和物品相似度计算。这需要用到协同过滤、矩阵分解、Embedding、DeepFM等算法。B卷里考KNN其实就是协同过滤的基础——找和目标用户兴趣最相近的其他用户把他们喜欢的内容推荐过来。考聚类算法是因为推荐系统经常需要做用户分群不同群体给不同的推荐策略。我当时准备这块的时候会把“用户-主播-互动”建模成一个二分图然后用Graph Embedding或者简单的二分图匹配算法做推荐。B卷里考的二分图HK算法其实就是这类匹配问题的一个解法。第二块内容理解。直播平台上每天有海量的开播画面需要AI自动识别有没有违规内容。这就要用到图像分类、目标检测、图像锐化的拉普拉斯算法这些图像处理知识。B卷里提到的Sobel算法、拉普拉斯算法都是图像边缘检测的基础算子。做直播内容审核的时候先用这些算子提取边缘信息再用卷积神经网络做分类是一条很实用的技术路线。第三块实时风控。直播间里可能会有人发广告、刷屏、恶意举报。这东西要靠规则引擎和机器学习模型结合做。规则引擎里有一个经典的Rete算法B卷也考到了它是Drools规则引擎的核心。Rete算法的基本思想是“利用规则之间的结构共享减少重复匹配计算”。当规则数量很多时Rete通过构建一个判别网络把匹配过程变得高效。如果你想在算法岗笔试中脱颖而出能把Rete算法的实现原理和事实匹配过程讲清楚绝对是加分项。音频重采样算法在B卷里也有提及这主要是因为直播里的麦序、合唱、KTV这些功能需要在不同采样率的音频之间做转换。重采样本质上是一个插值问题常见的有线性插值、三次样条插值更专业的是基于FFT的重采样。所以你看这套B卷的每道题几乎都能对应到一个实际的业务场景。准备笔试的时候不要单纯刷题可以多想一层“这个算法在业务里解决什么问题”这样面试的时候被问到项目经历你也更有话可说。8. 实操手把手过一遍B卷几道典型题目的完整解题过程说了这么多我挑几道B卷里的典型题目按我当时在草稿纸上的完整思考流程带大家走一遍。8.1 题目1模式串pabacaba求next数组第一步确定next数组的定义。我采用的约定是next[0] -1next[i]表示“模式串前i个字符组成的子串的最长相等前后缀长度”其中i从0开始next[0]特殊处理为-1。第二步逐位推导next[0] -1i1前1个字符是a最长相等前后缀长度为0next[1] 0i2前2个字符是aba ! bnext[2] 0i3前3个字符是aba最长相等前后缀是a长度1next[3] 1i4前4个字符是abaca ! cab ! baaba ! bacnext[4] 0i5前5个字符是abaca最长相等前后缀是a长度1next[5] 1i6前6个字符是abacab最长相等前后缀是ab长度2next[6] 2所以next数组为[-1, 0, 0, 1, 0, 1, 2]。第三步验证。KMP匹配时假设文本串是abacabacaba模式串是abacaba。当模式串匹配到最后一个字符a时发现不匹配文本串对应位置是c此时模式串已经匹配了7个字符next[6]2所以模式串跳到下标2的位置继续和当前文本串字符比较。这个过程可以手动推演一遍能加深理解。8.2 题目2区间调度问题——最多不重叠区间数量题目描述给定N个区间[start_i, end_i]选出尽量多的区间使得它们互不重叠。第一步确定策略。按end升序排序然后贪心选择。我当时的思考是为什么按end排不按start排因为结束得越早后面的区间选择空间越大。第二步写代码def max_non_overlapping(intervals): intervals.sort(keylambda x: x[1]) count 0 last_end float(-inf) for start, end in intervals: if start last_end: count 1 last_end end return count第三步处理边界条件。如果区间是闭区间即[start, end]内所有点都被占用那么下一个区间的start必须严格大于last_end所以用start last_end。如果区间是开区间或者允许首尾相接条件需要微调。我笔试的时候会特别注意题目里有没有说明区间开闭性这是隐藏的坑。8.3 题目3堆排序与Top K题目描述给定一个无序数组找出最大的K个数。第一步判断时间复杂度要求。如果K远小于数组长度用小顶堆维护大小为K的窗口是最高效的。第二步代码实现import heapq def top_k_largest(nums, k): heap nums[:k] heapq.heapify(heap) for num in nums[k:]: if num heap[0]: heapq.heapreplace(heap, num) return sorted(heap, reverseTrue)第三步分析。这里用的是Python的heapq默认是小顶堆。heapreplace是“弹出堆顶并插入新元素”的原子操作时间复杂度O(log k)比先pop再push更快。笔试时手写的话可以用上一节我给的sift_down模板来手动实现逻辑是一样的。8.4 题目4快速幂题目描述计算2^1000000000对1000000007取模的结果。第一步直接循环会超时必须用快速幂。第二步代码MOD 1000000007 def fast_pow(a, b): res 1 while b: if b 1: res res * a % MOD a a * a % MOD b 1 return res print(fast_pow(2, 1000000000))第三步注意溢出。Python大整数天然支持任意精度但在C里要注意中间结果可能溢出所以取模运算要在每次乘法后都做。9. 避坑指南我在这套题上踩过的五个坑准备这套B卷的时候我实际上踩过不少坑这里挑五个最典型的分享出来希望能帮你省点时间。9.1 坑一KMP的next数组定义不清这是我在B卷上最大的教训。刷题的时候有时候从这篇博客看一种写法从那篇博客又看到另一种写法最后代码里两种风格混在一起怎么跑都不对。解法统一定义。我把next数组的定义固定为“next[i]表示模式串前i个字符的最长相等前后缀长度next[0] -1”。不管是看题解还是写代码都先确认自己的定义不混淆。9.2 坑二动态规划的状态定义过于抽象做DP题的时候我一开始总是试图把状态定义成“从第i个到第j个的最优值”然后发现状态转移方程根本推不出来。后来我总结出一个经验状态定义的时候把“最后一步发生的场景”画出来或者想清楚“如果要得到这个最优解最后一步做了哪个决策”状态里需要记录的最小信息就是那个决策所依赖变量。9.3 坑三二分图匹配原理没搞透B卷里提到二分图HK算法我当时只记住了匈牙利算法的DFS写法HK算法只在博客上看过原理没手推过。后来才知道HK算法其实就是“BFS找最短增广路 DFS进行增广”把多个增广路同时处理效率比匈牙利高很多。笔试考这个的概率不高但如果有余力建议把两种算法都手推一遍。9.4 坑四忽略数据范围直接套模板比如题目说N最大是10^5你还写O(n^2)的冒泡排序肯定超时。我养成了一个习惯每道题读完先看数据范围据此判断允许的时间复杂度再选择算法。N 10^5时O(n log n)是基本要求N 10^3时O(n^2)没问题N 100时甚至可以考虑O(n^3)的Floyd算法。9.5 坑五只刷题不总结B卷考的知识点非常广如果只是盲目刷题一道题做完就扔效率很低。我当时做了一个错题本把每道错题涉及的知识点、我的错误原因、正确解法三栏记录下来。每周五把错题本翻一遍用“只看题目想思路”的方式检验自己是不是真的会了。10. 当笔试遇到没见过的题应对策略与思维框架笔试不可能全是你准备好的题遇到新题怎么办我的策略是有一套固定思维框架的这里分享给你。第一步判断题型。读完题目后先抛出一个问题“这题是什么类型”是数组、字符串、树、图还是数学题如果题里有“最大”“最小”“最优”这些词大概率是动态规划或贪心如果题里有“能否到达”“最短路径”大概率是图论。第二步判断数据范围。看N的范围决定时间复杂度上限。这个决定你用的算法。第三步尝试暴力解。先把暴力思路在脑子里过一遍比如O(n^2)的枚举。暴力解不一定能过但它能帮你构建对题目的理解也能帮你找到优化的切入点。第四步思考能否用二分答案。很多最优化问题都藏着单调性。比如“最多能有几个不重叠区间”这个问题你如果不知道怎么贪心可以尝试“能否选K个区间”这个判定问题然后二分K。如果判定能在O(n)完成总复杂度就是O(n log n)。“最小值最大”这类题二分答案几乎是标配解法。第五步如果以上都不行就写部分分。笔试的评测逻辑通常是部分得分暴力也能拿30%的分千万别空白。我见过太多人在一道80分的题上空着最后总分不及格。你哪怕写个暴力也比交白卷强得多。这套思维框架我后来也带进工作和面试里了。遇到一个陌生领域的问题我不会慌而是用同样的套路去拆解这是什么问题类型数据规模多大有没有朴素解法能不能换一种表述让它变成我熟悉的问题这套思考方式比记住多少算法都管用。11. 算法岗笔试的长线准备路线从B卷出发的完整规划如果你不是马上要考试而是有充裕的准备时间我建议你按照下面的路线系统准备这套路线是我自己验证过的也是我认为最稳的。第一阶段基础数据结构打底1-2周。把数组、链表、栈、队列、树、图这六种数据结构吃透做到不假思索就能写出增删改查。排序算法至少能手写五种冒泡、选择、插入、归并、快排。每写完一个就分析它的时间复杂度和稳定性。这个阶段不追求难题追求的是速度。第二阶段经典算法逐项突破3-4周。按知识点模块突破二分查找、双指针、滑动窗口、KMP、前缀和、差分、贪心、动态规划、回溯、DFS/BFS、拓扑排序、Dijkstra。每天选一个主题先看原理再手写模板最后刷5-8道相关题目。这一阶段的重点是要理解每个算法的“为什么”——为什么贪心成立为什么DP状态是这么定义的不满足于只记住答案。第三阶段真题实战与限时训练2周。开始做真实的笔试题按模块和难度分类刷。重点是限时训练每道题给自己定一个时间上限比如简单题15分钟中等题30分钟难题45分钟。模拟笔试的紧张感培养时间分配能力。我当时的策略是先花5分钟通读所有题目评估每道题的难度然后从简单题开始做把简单的分数先拿到手再死磕难题。这样至少保证基础分不丢。第四阶段复盘与查漏补缺持续。每次做完一套题花至少和做题一样的时间去复盘。我在这个阶段会把错题按知识点分类找出自己最薄弱的模块然后回到第二阶段去补。我个人特别推荐一个做法把自己做过的题整理成一套“个人题典”按知识点分类每个知识点放两三道最有代表性的题旁边标注解题思路的关键步骤和易错点。考前看这个题典比翻几十篇题解高效得多。这条路线下来不光是应付映客B卷任何一家大厂的算法笔试基本都能从容应对。算法功底的积累没有捷径但走的路径对的话每道题都在帮你建立更牢固的基底。我这里再分享一个实操里验证过的小技巧笔试前把手写几个核心模板的时间量一下——堆排序多久能写完、Dijkstra多久能写完、KMP的next数组多久能构造出来。如果你任何一个超过10分钟说明还不够熟练不用等考试先回去把这些模板写到闭眼都能默写的程度再说。这是我在多次笔试后总结出来的最朴素的提分方法一份半小时就能默写完所有模板的功底会让你在考场上多出几十分的时间去攻克真正的难题。
返回列表