
每年秋招的算法笔试总有人挂在一些看似基础、实则暗藏坑的题上。我到现在还记得爱奇艺2020校招算法方向第二场笔试的现场——四个小时的机试前面是几十道选择后面是手撕代码加分析题考完出来手指都是僵的。这套题让我印象特别深因为它考察的范围非常典型从KMP这种字符串匹配基础到排序、贪心、聚类再到贴近视频推荐场景的开放题几乎把一个算法工程师日常要用到的知识面都扫了一遍。这篇文章我会把第二场笔试的题型结构、核心考点和答题思路完整复盘一遍顺带补充一些我后来总结的备考经验。无论你是今年准备投爱奇艺算法岗的应届生还是单纯想用这套题检验一下自己的基础功底都可以把它当成一面镜子——因为很多考点到了面试阶段还会换着花样再考一次。1. 题型速览与整体考点分布1.1 第二场笔试的题型构成爱奇艺2020校招算法方向的笔试分为多场第二场的题目整体风格是“基础题为主、场景题为辅”。我记忆里的题型大致可以分为四块选择题、手写代码题、简答题和场景分析题。选择题覆盖面很广涉及数据结构、机器学习基础、深度学习基础、概率统计手写代码题集中在字符串、排序、动态规划和贪心场景分析题则会结合爱奇艺的视频推荐、内容理解业务来出。这套题的题量不算小选择加代码加分析整体时间相当紧张。所以做这套题的第一要务不是追求每道题都满分而是先把有把握的题稳稳拿住。我记得考场上有人纠结一道选择题的边界定义结果后面两道送分代码题没写完非常可惜。1.2 为什么第二场更侧重基础算法很多同学会疑惑校招笔试题为什么不直接考“用TensorFlow搭一个推荐模型”反而花大篇幅考KMP、排序、聚类这些“老古董”我的理解是校招和社招的筛人逻辑完全不同。校招候选人大多没有完整的工业项目经验企业没法通过作品集判断你的水平只能通过标准化的基础题快速筛掉两类人一类是编程功底不过关的一类是基础概念理解浮于表面的。爱奇艺的算法岗位其实细分很多有做推荐的、有做视频理解的、有做NLP的笔试阶段必须先保证所有候选人具备通用的算法和工程能力后续面试再按方向深入考察。换句话说基础题不是用来刁难你的而是用来建立一个统一的“及格线”。这类题往往不追求刁钻的数学推导但非常考验对原理的准确理解和对细节的把握。1.3 时间分配与做题策略个人建议是拿到卷子先花两三分钟浏览一遍全部题目标注出“一眼就会”“需要想一想”“完全不会”三类题。先做“一眼就会”的再做“需要想一想”的最后再看“完全不会”的。千万避免在开头遇到一道难题就死磕半小时导致后面送分题没时间写。选择题遇到模棱两可的选项先排除绝对错误的再根据自己对概念的理解做判断不要在单题上停留超过三分钟。代码题则优先选择自己最熟悉的语言不要临时切换语言导致语法错误频出。我当时用Python写代码题部分语言特性和边界处理不熟悉后来复盘时才发现有几处可以明显优化的地方。2. 编程题复盘KMP、排序与边界陷阱2.1 KMP的next数组到底怎么算第二场笔试中出现了一道关于KMP算法next数组的选择题题目给了模式串p abacaba要求判断next数组的取值。热搜词里也提到了这道题看来很多同学对next数组的定义和计算方式理解得不够透彻。这里先明确一个常见的定义next[i]表示模式串p的前i个字符组成的子串中最长相等前后缀的长度同时约定next[0] -1。基于这个定义我们手动推一遍p abacaba子串最长相等前后缀next值无-1a无0ab无0abaa1abac无0abacaa1abacabab2abacabaaba3所以next数组为[-1, 0, 0, 1, 0, 1, 2, 3]。这里有个很容易踩的坑不同教材对next数组的起点和含义定义不完全相同有的从0开始有的从1开始有的表示“失配后跳转的位置”有的表示“前缀函数”。如果题目没明确说明定义方式看到选项时一定要先判断它用的是哪一套规矩再计算。最好的应对办法是自己心里有一套清晰的推导链条不管题目怎么改都能快速对回去。如果考到手写KMP匹配推荐把求next数组和匹配主循环分开写结构清晰减少出错。下面给一个简洁的Python实现def get_next(p): n len(p) nxt [-1] * n i, j 0, -1 while i n - 1: if j -1 or p[i] p[j]: i 1 j 1 nxt[i] j else: j nxt[j] return nxt def kmp_search(s, p): n, m len(s), len(p) nxt get_next(p) i j 0 while i n: if j -1 or s[i] p[j]: i 1 j 1 else: j nxt[j] if j m: return i - j return -1注意上面的写法里j -1是作为递归调用的出口条件这是KMP实现里最经典的边界保护之一漏掉它很容易死循环。2.2 排序算法手写快排与堆排的细节排序算法也是笔试常客。第二场选择题里有关于排序算法稳定性、时间复杂度的辨析代码题里虽然不一定直接要求“写一个快排”但很多题目的预处理步骤会用到排序所以排序的基本功必须足够扎实。快速排序的核心在于partition函数。笔试时最怕的是边界处理出错比如left right写成了left right或者选基准值后两个指针的移动顺序不对。我推荐写快排时使用“挖坑法”或者“左右指针法”同时注意基准值的选择。如果数据基本有序固定选第一个元素会导致时间复杂度退化为 O(n^2)所以最好用“三数取中”或者随机选基准。堆排序的重点则是heapify函数的实现。笔试时不需要你写出完整的堆排序但必须清楚建堆、调整、排序三步骤的时间复杂度建堆 O(n)调整 O(n log n)整体 O(n log n)。另外堆排序是不稳定排序这一点在选择题里常考。我见过不少同学在试卷上写堆排序时把heapify写成递归但没有注意递归深度对栈空间的影响。如果使用Python排序规模很大时递归可能爆栈笔试现场最好写成迭代版本或者明确说明这里的时间复杂度。2.3 贪心与DP的经典考法第二场代码题里有典型的贪心和动态规划题虽然记忆里不是那种偏题怪题但很能体现候选人的思维深度。比如区间调度类的贪心问题考察点在于证明贪心策略的正确性以及能否写出清晰的实现。动态规划题则更偏向经典模型比如最长回文子串、背包问题变种。这里我特别想说一个点很多同学DP状态定义得出来但不知道如何初始化、如何确定遍历顺序。笔试时如果时间紧张可以先写一个暴力递归版本保证正确性再优化成记忆化搜索或者自底向上DP。在现场能跑通比一味追求最优解法更重要。同时建议在写DP时用注释标明状态含义、转移方程、边界条件。面试官看代码不仅看结果更看思路一份注释清晰的代码能让你在技术评审时占很大便宜。3. 机器学习与深度学习考点深挖3.1 选择题高频考点损失函数、过拟合、特征归一化爱奇艺算法岗笔试的选择题在机器学习部分不会太偏但会考察很多容易混淆的概念。比如L1正则化和L2正则化的区别、Dropout的原理、批归一化在训练和推理阶段的差异、SVM的核函数选择、逻辑回归为什么用交叉熵而不是均方误差。印象里有一道题专门问“为什么分类问题常用交叉熵作为损失函数而不用均方误差”。这个问题我觉得值得展开说一下因为它其实考察的是优化层面的理解交叉熵配合softmax在梯度反传时形式简洁且不容易出现梯度饱和而均方误差配合sigmoid时在预测值接近真实值或远离真实值的情况下梯度都可能变得非常小导致训练缓慢。回答这类选择题时不要只背结论最好能理解每个设计背后的动机。机器学习模型的很多选择不是“只能用这个”而是“在这个场景下这个选择有明确的优势”。3.2 聚类与KNN场景题里为什么老考热搜词里出现了“聚类算法”和“KNN算法的应用能力包括哪三个方面”这些都是爱奇艺笔试喜欢考察的方向。视频平台有海量内容如何做用户分群、如何做相似视频召回本质上都可以归约到聚类和近邻问题。考聚类时K-Means是必背算法。除了算法步骤还要能回答K值怎么选、如何评估聚类效果、初始中心点怎么选。比如“K-Means”就是一种改进的初始化策略它可以降低初始中心选择不当导致陷入局部最优的概率。距离度量上也常常设坑欧式距离、曼哈顿距离、余弦相似度适用的场景不同文本向量用余弦相似度更合理而用户行为特征用欧式距离可能更直观。KNN则常考三个核心要素K值的选择、距离度量方式、分类决策规则。这三个方面分别影响模型的拟合程度、相似度计算方式和最终预测结果。爱奇艺的“相似视频推荐”里就有KNN的思想给用户推荐与当前视频最相似的N个视频。理解了这类业务映射答题时才能把算法题答出“场景感”。3.3 KL散度与ELBO基础概念可以考得很难热搜词里有一项是“kl elbo 算法原理详解”这大概率是笔试后大家集中搜索的难点。KL散度是衡量两个概率分布差异的指标在变分推断、生成模型里极其重要。ELBO证据下界是变分推断中对数边际似然的下界很多同学看到公式就头大但笔试往往不会让你现场推完整变分推导而是考察对概念的定性理解。比如会问KL散度是否对称、取值是否非负、ELBO和KL散度的关系是什么。记忆里这道题的陷阱在于不少同学把KL散度当成“距离”实际上它不满足对称性和三角不等式所以不能叫距离。ELBO则通常写成log p(x) ≥ E_q(z)[log p(x,z) - log q(z)]也就是“ELBO等于对数边际似然减去KL散度”的形式。理解到这个层面选择题基本不会错。备考时遇到这类公式不要死记硬背。我的方法是把每个符号用中文念一遍“q分布下的期望、联合概率、q的概率”然后想清楚这个式子想表达什么——它是在用近似分布q去逼近真实后验。理解了含义自然就能应对各种变体考法。3.4 深度学习基础从反向传播到注意力机制深度学习部分也出现在选择题和简答题里。反向传播的计算图推导是基础中的基础笔试时会以“某个简单网络参数更新的方向是什么”形式出现。这时需要会根据链式法则手动推一推梯度知道哪一层梯度大、哪一层梯度小以及梯度消失是怎么产生的。2018年Transformer出来后注意力机制也成了校招笔试的常见考点。会问Self-Attention的Q、K、V分别是什么为什么attention要除以√d_k。这个除以√d_k的细节很多人会忽略它的作用是调节点积的数值范围防止softmax输出过于饱和造成梯度消失。笔试如果有代码填空很可能会在这里设坑。4. 综合题与视频推荐场景实战4.1 推荐系统召回、粗排、精排完整链路爱奇艺算法岗笔试的综合题非常喜欢结合视频推荐业务。我记得有一道题大概是“设计一个视频推荐系统的召回策略”或者“如何处理冷启动用户”。这类题目表面开放其实是在考察你对推荐系统整体链路的理解。答这类题最好的框架是“召回—粗排—精排—重排”。召回阶段追求从全量池子里快速找出用户可能感兴趣的几百个候选常用方法有协同过滤、双塔模型、向量召回粗排阶段用轻量模型对召回结果做初步过滤降低精排压力精排阶段使用复杂模型做CTR/CVR预估需要考虑特征交叉和用户实时行为重排阶段则要考虑多样性、新鲜度、商业价值等约束。我在答卷时会把链路画成文字描述再针对其中一个环节展开细节。面试官想看的是你“有没有全局视野”以及“在某一个环节能不能深入到底”。与其把每个环节都写得很泛不如挑召回阶段详写用“用户协同过滤 物品协同过滤 向量召回”的组合方案再配上冷启动的兜底策略。4.2 面对开放题怎么组织答案开放题最忌的是想到哪写到哪毫无逻辑。我后来总结了一套回答模板先明确目标再列出约束然后给出方法最后说明评估指标。举个例子题目问“如何检测重复视频片段”。你不能上来就写“用感知哈希”而是要先定义“重复”的含义——是完全相同的视频还是压缩后仍相似的视频或是相同内容不同剪辑的版本定义清楚了再分层解决第一层用帧采样和感知哈希做粗筛第二层用特征向量匹配做细筛第三层结合业务规则做过滤。最后用“召回率、精确率、误报率”来评估方案效果。这个模板的核心价值在于它向面试官展示了你的结构化思维而结构化思维恰恰是工业界算法工程师最稀缺的能力之一。笔试答案写到这个颗粒度分数通常不会低。4.3 从笔试到面试你要展示的不只是答案爱奇艺的笔试通过后面试官手里很可能拿着你的答卷。你会发现面试时他问的问题有一部分就是针对你笔试中暴露的薄弱点。比如你KMP的next数组写错了面试官可能让你现场重新推导一遍你开放题里提到“双塔模型”面试官可能接着问“双塔模型为什么能用于召回它的训练样本怎么构造”。所以笔试结束不等于万事大吉。考完当天趁记忆还新鲜把每道题重新做一遍整理成错题本这比刷十套新题还有用。尤其是那些“当时觉得会但实际做错”的题往往就是面试时的重点追问对象。5. 复盘方法论与备考路线5.1 考后当天怎么做复盘我自己的习惯是考后当天不急着对答案先把能回忆起来的题目按“选择题/代码题/分析题”分类记录标注每道题的考点和自己的答题状态。然后第二天再逐题查资料把每道题的完整解法和原理写成笔记。这个习惯让我在后续多家公司的笔试中受益匪浅因为很多大厂考察的知识点高度重合只是换了层壳。复盘时重点关注三类题第一类是“完全不会”的这类要先搞懂概念第二类是“会但做错”的这类是提分最快的第三类是“做对但不确定”的这类说明理解还不够透彻面试可能被问倒。5.2 校招算法备考的资源清单很多同学问过我备考用什么资料我一般按“基础数据结构/算法、机器学习、深度学习、业务场景”四个维度来推荐。数据结构与算法方面以经典教材和在线刷题平台为主重点刷字符串、排序、树、图、DP、贪心机器学习方面把经典教材中的公式推导过一遍理解损失函数、正则化、SVM、K-Means、KNN、PCA、聚类等核心概念深度学习方面重点掌握反向传播、CNN、RNN、注意力机制、Transformer的基础原理。业务场景题需要平时积累。建议多从用户视角使用爱奇艺这类视频App思考“为什么首页推荐这个视频”“为什么相似视频是这些”“搜索时哪些因素影响排序”。这些观察都会成为你回答开放题的素材。5.3 一些小知识点可能会成为救命稻草笔试中有一些小知识点虽然分值不高但关键时刻能救命。比如二分查找的边界写法、KMP和BM算法的区别、稳定排序和不稳定排序的典型例子、朴素贝叶斯为什么“朴素”、TF-IDF的IDF公式、L1正则化为什么产生稀疏解、Gini系数和信息增益的关系、dropout训练和测试阶段的缩放。这些小点看似散乱却是选择题里最稳定的得分来源。我建议备考时做一张“知识点速查表”按算法、机器学习、深度学习、业务场景四个模块分类记录考前两小时快速过一遍。不需要背得很深但需要做到看到关键词就能反应出核心结论。6. 个人经验与常见误区6.1 基础题错在哪不是不会是习惯不好每次复盘笔试错题我都会发现一个规律丢分最多的不是最难的题而是那些“基础但需要准确表达”的题。比如KMP的next数组下标偏移、快排的边界条件、DP状态转移的初始化这些错都不是因为“不会”而是因为平时写代码时养成了依赖IDE提示的习惯手写时就容易崩。所以我在这个部分特别强调校招笔试前一定要专门练“无IDE环境”的代码书写。拿一张白纸从零手写快排、堆排、KMP、并查集、二分查找不是要在纸上运行而是训练自己把边界条件、变量命名、循环终止条件想清楚的习惯。6.2 算法工程师笔试的“软实力”最后一类容易被忽视的得分点是答题规范。代码题写完后如果时间允许可以在代码块上方写一行的“思路说明”比如“利用双指针降低时间复杂度到O(n)”简答题一定要分点作答别写成一整段流水账开放题写完后可以加一句“如果数据规模更大可以用XXX优化”。这些细节不一定加分但能让面试官感受到你是一个思路清晰、有条理的人。我个人在实际操作中的体会是笔试不只是刷人的关卡它更是一次高效的自测。每次笔试结束你都会更清楚自己哪里薄弱、哪里还需要补课。即使这次没过只要认真复盘下次一定比这次强。希望这篇复盘对正在准备校招的你有点帮助。最后再分享一个小技巧不管笔试结果如何考完当天把每道题重新做一遍、整理清楚这些题很可能就是面试官手边的题认真对待每一份答卷的人运气都不会太差。