十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

猿辅导2020校招算法岗笔试复盘:核心考点与实战技巧

猿辅导2020校招算法岗笔试复盘:核心考点与实战技巧 聊一个偏实战的话题猿辅导2020校招笔试算法岗二。那段时间我正好在准备互联网大厂和在线教育公司的算法岗前后刷了不少笔试题也踩了不少坑。后来复盘发现猿辅导这类在线教育公司的算法笔试和纯互联网公司不太一样它既考常规的数据结构与算法题也会掺入不少机器学习、深度学习的基础原理甚至会结合教育场景出一些建模题。这篇文章把我复盘到的考察点、解题思路和做题技巧整理出来给准备算法岗校招、尤其是想去在线教育赛道的同学一个参考。无论你是科班出身、半路转行还是刷题刷到麻木的求职者只要你目标岗位是算法工程师这套复盘思路都能复用。下面我会从笔试的整体画像、数据结构与算法考点、机器学习与深度学习侧重点、模拟题拆解、以及实战踩坑五个角度展开聊尽量还原当时我面对考卷时的心路历程。1. 猿辅导算法岗笔试的整体画像与考察逻辑1.1 为什么在线教育公司算法笔试是“代码 模型”双线考察很多人一听“算法岗”下意识觉得就是刷LeetCode但教育公司的算法岗笔试往往不是纯代码题。猿辅导的核心业务是K12直播课、网课、题库和智能练习系统算法团队要解决的是题目推荐、学情分析、作文批改、语音评测、图像识别等一系列问题。这意味着候选人不仅要能写出正确的代码还要对机器学习、深度学习的基本原理有扎实的理解否则就算代码过关模型题也会露馅。我当时的直观感受是这套笔试题更像是“软件工程师笔试 机器学习基础笔试”的合卷。编程题占一部分模型原理题占一部分还有一部分是开放设计题。如果你只刷题不看西瓜书或者只背模型公式不写代码都容易翻车。备考的时候最好两手抓手撕代码能力是门票模型理解能力是加分项两者缺一不可。1.2 题型分布与答题节奏的常见设定根据我当时参加的笔试经验以及和同期同学交流的信息2020年前后猿辅导算法岗笔试的题型通常可以归纳为三类单选题/多选题覆盖数据结构、操作系统、概率统计、机器学习基础概念题量不大但很杂。编程题一般2到4道难度从简单到中等偏上考察字符串处理、动态规划、排序、二叉树等经典内容。简答题/设计题给出一个教育业务场景要求描述建模思路、特征工程方案或者解释某个算法原理。时间上整套笔试一般控制在90分钟到120分钟。这个节奏比技术大厂要宽松一些但因为有简答题实际写起来不会太轻松。我个人的建议是拿到卷子先浏览一遍把编程题的难度排个序。先做自己最有把握的题保证必得的分先拿到再回头啃难题。不要在第一道编程题上卡太久否则后面的模型题会非常被动。1.3 算法岗笔试的复习优先级清单如果把考察内容按出现概率排个序我复盘下来大概是这样一个优先级优先级内容方向具体考点高数据结构与手写代码KMP、快排、堆排序、TopK、链表反转、二叉树遍历高动态规划与贪心最长公共子序列、背包问题、区间DP、贪心证明中高机器学习基础LR、SVM、决策树、KNN、K-Means、过拟合、评估指标中深度学习基础反向传播、优化器、BatchNorm、Dropout、CNN/RNN中低业务场景设计题目推荐、学生成绩预测、作文批改、学习路径规划低进阶搜索/启发式粒子群、模拟退火、遗传算法、卡尔曼滤波、A*这只是一个参考清单不代表每场笔试都会全考但它能帮你判断时间分配。我当时就是按照这个表来复习的先在LeetCode上把高频数据结构和DP题刷了两遍再回头啃机器学习公式推导效率和针对性都提升了不少。2. 核心细节解析与实操要点2.1 KMP算法手算next数组是高频考点我记得当初笔试前最担心的一道题就是KMP因为它看似简单但next数组的定义在不同教材里都不一样一个不留神就算错。猿辅导的笔试选择题里非常喜欢考这种“给一个模式串算next数组”的题目。以模式串 p abacaba 为例我们要明确next数组的定义next[i] 表示 p[0...i] 这个子串中最长的相等前后缀长度有些教材叫部分匹配表PMT。网上常见做法是 next[0] -1也有写法是 next[0] 0不同定义会导致结果不同。我当时给自己定了一个规矩看到题目先确认next的定义再用“前后缀最长相等长度”来手算。手算过程其实不复杂。对于 abacabanext[0]单个字符a没有真前后缀定义为0。next[1]ab前缀a后缀b不相等为0。next[2]aba前缀a、ab后缀ba、a最长相等是a长度为1。next[3]abac前缀a、ab、aba后缀bac、ac、c最长相等为0。next[4]abaca前缀a、ab、aba、abac后缀baca、aca、ca、a最长相等a长度为1。next[5]abacab前缀a、ab、aba、abac、abaca后缀bacab、acab、cab、ab、b最长相等ab长度为2。next[6]abacaba最长相等前后缀是aba长度为3。所以按照next[0]0的定义整串的next数组是 [0, 0, 1, 0, 1, 2, 3]。我建议你在考场上写代码时也按这个思路先算最长相等前后缀长度再根据题目指定的定义调整下标偏移这样最简单也不容易出错。2.2 排序与TopK不要只会调API排序算法是笔试选择题的常客冒泡排序、快排、堆排序、归并排序的时间复杂度和稳定性几乎每次都会遇到。但编程题不会直接让你写一个排序函数而是会把排序包装成场景最常见的两个变体就是TopK问题和求中位数问题。TopK问题最典型的解法有两种第一种是维护一个大小为K的小顶堆遍历所有元素堆顶就是当前第K大的元素第二种是基于快排分区的思想平均复杂度能做到O(n)但最坏情况退化到O(n²)。笔试时我更推荐用小顶堆因为代码逻辑简单、不容易写错而且面试官挑不出稳定性的毛病。这里要提醒一个细节如果你用C优先用priority_queue默认是大顶堆要改成小顶堆需要这样写priority_queueint, vectorint, greaterint pq;如果用Python用heapq模块默认也是小顶堆import heapq heap [] for num in nums: if len(heap) k: heapq.heappush(heap, num) elif num heap[0]: heapq.heapreplace(heap, num)我当时就吃过这个亏C里忘写greater 结果取出来全是最大的几个值等于白写。所以每次写完堆相关代码我都会先确认“堆顶是不是我想要的极值”。2.3 动态规划与贪心状态定义决定成败动态规划是算法岗笔试的绝对主力。猿辅导的编程题里最长公共子序列、最长上升子序列、背包类问题都是高概率出现的。做题的时候我最大的感受是状态定义决定了后续所有的转移方程如果状态定义错了后面再怎么调都是错的。拿最长公共子序列LCS举例经典做法是定义 dp[i][j] 表示字符串A的前i个字符和字符串B的前j个字符的LCS长度。转移方程是如果 A[i-1] B[j-1]那么 dp[i][j] dp[i-1][j-1] 1否则 dp[i][j] max(dp[i-1][j], dp[i][j-1])这个题还有一个孪生兄弟是最长公共子串子串要求连续所以当字符不匹配时dp[i][j] 要清零而不是取max。这两个题非常容易混笔试时一定要先看清是“子序列”还是“子串”。贪心算法在笔试里往往以“能否贪心”为考察点。遇到这类题我建议你先别急着写代码先想清楚贪心策略是什么能不能举出反例。如果五分钟内举不出反例大概率可以贪心但如果感觉边界情况很复杂那八成是动态规划。笔试时宁可多花几分钟想清楚也不要写了一个错误的贪心策略后反复试错。3. 机器学习与深度学习的笔试侧重点3.1 经典模型原理LR、SVM、KNN与K-Means猿辅导笔试的选择题和简答题里机器学习基础概念出现的频率非常高。逻辑回归LR几乎是必考重点包括为什么LR用交叉熵损失而不是均方误差、sigmoid函数的作用、LR是线性模型还是非线性模型。这些问题看起来基础但如果理解不透彻很容易在简答题里说不清楚。SVM也是一个高频考点尤其是核函数的作用。有一个经典问题为什么SVM要引入核函数答案是为了解决线性不可分问题把低维空间的数据映射到高维空间让数据在高维空间线性可分。这里要补充一句核函数并没有改变样本本身而是通过内积计算隐式地完成了映射所以不会大幅增加计算量。KNN和K-Means这两个名字很像但一个是监督学习一个是无监督学习。KNN是分类/回归算法K-Means是聚类算法。我在笔试简答题里遇到过类似问题后来总结了一个万能回答框架先说明两者本质区别再补充各自的超参数KNN的K和距离度量、K-Means的簇数和初始中心点最后提一嘴优缺点这样答案既完整又有层次感。3.2 深度学习高频问题反向传播、过拟合与优化器深度学习在算法岗笔试里占比不如机器学习基础那么高但一定会碰到。最常见的是反向传播的概念题比如“请解释反向传播的基本原理”。我一般会这样回答前向传播计算出损失值然后根据链式法则从输出层往输入层逐层计算梯度再用梯度下降等优化算法更新参数。过拟合问题几乎是必考题尤其是简答题。解决方案可以从四个维度展开数据层面增加数据量、数据增强。模型层面降低模型复杂度、减少层数或参数。训练层面早停、Dropout、正则化L1/L2。调参层面降低模型容量、调整学习率。优化器也是一个容易被追问的点。SGD、Momentum、RMSProp、Adam之间的区别以及在什么场景下用哪个我建议大家都提前准备一下。回答的时候不需要拽太深但要把“自适应学习率”这个概念讲清楚。3.3 结合教育业务场景的建模题这是我很想强调的一个板块。猿辅导笔试和普通互联网公司最大的区别就是会有教育场景对应的建模题。我当时遇到的几个典型场景包括如何预测学生下一道题的正确率。如何给学生推荐最适合的题目。如何用算法批改英语作文。如何识别学生上课走神或情绪异常。这些题目不会要求你写出完整代码而是考察你能否把业务问题转化为机器学习问题。回答这种开放题我会遵循一个固定套路明确目标是分类还是回归评价指标是什么。特征工程学生特征、题目特征、上下文特征尽量具体。模型选型简单模型起步如LR、GBDT再根据需要上深度学习。训练与评估数据划分、交叉验证、AB测试。这样回答最大的好处是逻辑完整面试官一眼就能看出你见过真实业务而不是只会背八股。4. 实操过程与核心环节实现4.1 编程题示例最长公共子序列为了让大家更直观地感受猿辅导笔试编程题的风格我整理了一道考频很高的算法题并给出可以“抄作业”的解法。题目给定两个字符串 text1 和 text2返回这两个字符串的最长公共子序列的长度。我用Python写一个最经典的动态规划版本def longestCommonSubsequence(text1: str, text2: str) - int: m, n len(text1), len(text2) dp [[0] * (n 1) for _ in range(m 1)] for i in range(1, m 1): for j in range(1, n 1): if text1[i - 1] text2[j - 1]: dp[i][j] dp[i - 1][j - 1] 1 else: dp[i][j] max(dp[i - 1][j], dp[i][j - 1]) return dp[m][n]这个代码的时间复杂度是O(m * n)空间复杂度也是O(m * n)。笔试的时候这个复杂度完全够用。如果你想压缩空间可以用滚动数组把二维dp变成一维dp但我建议笔试时优先保证正确性优化可以后面再提。这里有一个小技巧初始化dp数组时多申请一行一列下标从1开始这样就不用单独处理 i0 或 j0 的边界情况。很多边界问题都是因为数组下标越界导致的多开一格能省很多麻烦。4.2 编程题示例TopK问题第二个高频题是求数组中第K大的元素。这里有多种解法我给出一个基于堆的简洁实现import heapq def findKthLargest(nums, k): heap [] for num in nums: if len(heap) k: heapq.heappush(heap, num) elif num heap[0]: heapq.heapreplace(heap, num) return heap[0]这段代码维护一个size为K的小顶堆堆顶就是数组中第K大的元素。理解的关键在于小顶堆每次都淘汰当前堆里最小的元素所以保留在堆里的都是最大的K个元素堆顶恰好是这K个里最小的也就是全局第K大。我当时在这道题上犯过一个低级错误就是没有考虑K等于数组长度的情况。这种情况下小顶堆会一直push最后返回堆顶其实也没错但我因为没有加防御性判断导致代码逻辑里多了一次无用的替换操作。笔试时加上 if k 0 之类的保护会更稳妥。4.3 简答题示例从KNN与K-Means区别到过拟合解法简答题不是写代码但同样需要结构和逻辑。我提供一个常见问题的回答示范让大家感受一下答题的密度。问题KNN和K-Means算法的区别是什么我的回答思路前置分类KNN是监督学习算法用于分类或回归K-Means是无监督学习算法用于聚类。是否需要标签KNN需要带标签的训练数据K-Means不需要任何标签。工作方式不同KNN根据最近的K个样本投票决定新样本的类别K-Means通过迭代更新簇中心来划分样本。超参数不同KNN的K表示邻居个数K-Means的K表示聚类簇数。计算复杂度KNN预测时需要计算新样本与所有训练样本的距离成本较高K-Means训练时迭代更新中心点预测时将样本归入最近的簇。这样回答大概200字信息密度高逻辑完整阅卷人不需要费力去找重点。另外一个高频简答题是“过拟合怎么解决”回答的时候只要按我上面说的四维度展开基本就能拿满分。4.4 笔试现场的时间分配与做题顺序我后来复盘发现笔试分数不高往往不是因为题目难而是因为时间分配出了问题。我建议的做题顺序是快速浏览所有题目标记出“一定会做”的题。先做选择题控制在20分钟以内遇到不会的不要纠结。再做编程题优先做自己最熟悉的数据结构题和DP题。最后做简答题/开放设计题哪怕时间不够也要把框架写出来。这个顺序的核心逻辑是“先拿确定的分再拿不确定的分”。选择题通常简单但分值分散编程题分值高但容易卡壳简答题主观性强只要写就有分。千万不要在选择题里花太多时间研究一道模棱两可的题那是性价比最低的浪费时间方式。5. 常见问题与排查技巧实录5.1 编程题超时如何快速定位复杂度瓶颈笔试最常见的失败原因就是超时。我踩过一次坑有一道题我第一版用了一个O(n²)的解法测试用例能过但数据量一大就直接超时。当时我心态有点崩后来总结了一个排查套路看数据范围如果n的范围是10^5以上O(n²)基本必挂要往O(n log n)或O(n)想。看题意有序数组优先考虑二分最大/最小值问题考虑堆或单调栈子串/子序列考虑滑动窗口或DP。看是否存在重复计算如果有考虑用哈希表缓存中间结果。我建议每道编程题写完都顺手分析一下自己的复杂度然后在心里模拟一个最大数据规模的用例看能不能跑完。这个习惯能帮你规避大部分超时问题。5.2 边界条件与初始化错误怎么避免白给笔试题目里有几个常见的边界坑我整理成一张速查表边界场景常见错误解决办法空数组/空字符串直接访问下标越界开头判断 size 0单个元素循环边界写错用 i 1; i n 而不是 i n数值溢出int类型累加超限用 long long 或 Python int数组下标从0开始状态转移时取值错位dp多开一格下标对齐递归深度过大栈溢出改迭代或设置递归深度表里这些错我几乎全犯过。最离谱的一次是背包问题我把物品数量循环写到容量循环外面结果答案全错。从那以后我写任何DP题都会先手动走一遍小样例确认无误再提交。5.3 笔试环境与代码提交的隐性规则很多同学在本地IDE里写代码很流畅一到牛客网或者赛码网的笔试环境就各种不适。这里有几个隐性规则值得注意笔试平台不提供智能提示auto-complete几乎为零所以要习惯手写函数签名和头文件。输入输出格式必须严格匹配多半要求从标准输入读取用print输出不要输出多余调试信息。有些平台只给核心函数不给你读入代码这时候要看清函数签名不要自己定义输入逻辑。多组测试用例时记得在循环里处理每组数据而不是只跑一次。我当时就因为在牛客网的多组输入上处理错了浪费了十几分钟。建议提前去牛客网或者赛码网熟悉一下环境把常用的输入模板背下来比如Python的import sys for line in sys.stdin: a, b map(int, line.split()) print(a b)这种模板看起来简单但关键时刻能救命。5.4 简答题的踩坑只写结论不写过程简答题最容易犯的错是只写结论。比如问“为什么LR用交叉熵不用MSE”如果只回答“因为MSE是非凸的”大概率只能拿一半分。阅卷人更期待看到推导过程或直观解释MSE与sigmoid组合后损失函数不是凸函数梯度下降容易陷入局部最优而交叉熵与sigmoid组合后梯度表达式简洁不会出现梯度消失的问题。我建议简答题都按“结论 原因 例子/公式”的结构来写。哪怕公式写得不是特别精确也比空洞的结论要强。笔试时时间紧张但简答题只要知道方向写起来比编程题快得多。5.5 从笔试复盘到面试准备一个小技巧最后分享一个对后续面试很有帮助的方法。每次笔试结束后不要急着对答案而是把做错的题和不确定的题整理成一份错题本标注出考点、我的错误解法、正确解法、复杂度分析。这个错题本在面试前非常有价值比再刷一百道新题更高效。我当时把猿辅导这套笔试题复盘完之后把“KMP next数组手算”“TopK堆解法”“LCS动态规划”“过拟合四维度解决法”这四块内容都记在了错题本首页后面很多公司的笔试和面试都直接受益。算法岗的考察范围其实就那么大你只要把一个公司的笔试题吃透就能覆盖到其他公司七八成的考点。复盘完之后我最真实的体会是猿辅导2020校招笔试算法岗二不是靠临时背题能应付的它在用一套题同时测你代码基本功、算法思维和模型理解。我后来通过把每个高频考点整理成速查表面试前只看速查表效率高很多。如果你正在准备校招建议你少看视频多手写老老实实把KMP、堆排、DP经典题都手推一遍再做两三套教育公司的真题找手感。这套方法放到今天依然管用。
返回列表