
看到“爱奇艺2020校招算法方向笔试题第一场”这个标题我第一反应是经典。2020届校招就是2019年秋招那一波爱奇艺算法岗算是视频系大厂里出题比较有章法的。第一场笔试更是如此——题型规整、覆盖全面、难度梯度明显既能刷掉完全没准备的人又不会把基础扎实但没刷过难题的人卡死在门外。后来我复盘这套题最大的感受是它不考偏题怪题每一道都在反复敲打你算法基础是否真的扎实。这篇文章我会从几个角度来拆解先聊这套笔试整体的出题思路和考察意图再把高频考点逐个讲透然后挑几个典型题型做完整推导和代码实现最后整理考场上真实容易踩的坑。不管你是正在准备算法岗校招的应届生还是想跳槽到视频/推荐方向、需要重温基础算法的在职工程师这份内容都能帮你少走弯路。整套题覆盖了数据结构、经典算法、机器学习与深度学习基础几个大块下面我逐个展开。1. 笔试整体设计思路为什么爱奇艺这么考1.1 视频平台的算法岗到底在解决什么问题爱奇艺的算法方向招聘时一般分推荐、搜索、广告、视频理解、内容安全、风控等好几个子方向。不同方向对技能树的要求会有一点差异比如推荐偏机器学习、视频理解偏CV和深度学习但笔试是统一出题的所以考察的一定是公共基础——也就是无论你之后做哪个方向都必须掌握的算法和数据结构的底子。笔试考算法题本质不是真想让你在半小时内写出一个能在线上跑的推荐系统而是通过几道设计良好的题目快速判断你三个能力第一编码基本功能不能用代码把思路干净利落地表达出来第二算法思维碰到一个没见过的题能不能把它抽象成已知的模型第三边界意识你写出的代码是不是只在样例上能跑还是真的考虑了输入为空、数据量极大、内存受限这些真实情况。你可以把这场笔试想象成一次“安检”它不负责把最优秀的人挑出来只负责把不合格的人筛下去。所以它的题型设计必然是中规中矩的经典题而不是那种需要灵光一现的解谜题。1.2 三大题型的整体套路与应对策略综合历年的回忆版面经爱奇艺这套算法笔试大体可以分成三块题型。一块是选择题或者填空题考察概念、性质和复杂度分析速度要求高平均每题一两分钟一块是编程题两三道手写实现一般是从字符串、动态规划、贪心、图论这些范围里出还有一块是简答题考机器学习或深度学习的基础概念需要用文字把原理讲清楚。这三种题型的应对逻辑完全不同。选择题靠的是平时的积累和碎片记忆比如排序算法的时间复杂度、KMP的next数组、二叉树的遍历顺序这些如果平时没有形成条件反射临时推导会非常费时间。编程题靠的是手写代码的熟练度和对经典题的敏感度看到题目能快速判断属于哪类问题、用什么算法、复杂度能不能过。简答题则考验你“能不能把一件事讲明白”不是背书式的名词解释而是要有逻辑层次。这套组合拳其实映射了一线大厂对算法工程师的真实期望基础扎实、代码可靠、表达清晰。下面我按知识点逐个展开拆解。2. 高频考点拆解每一类题该怎么准备2.1 排序与查找别只背思路要能默写排序算法基本是每场校招笔试的必考内容但考法并不总是“让你写一个快排”更多时候是选择题里问复杂度、稳定性、最坏情况。我在准备时踩过一个坑觉得自己能写出快排就万事大吉结果碰到一道“堆排序第k大元素”的选择题被里面父子节点下标关系绕晕了白白丢分。建议把七种常见排序——冒泡、选择、插入、希尔、归并、快排、堆排——按三个维度整理成一张表平均时间复杂度、最坏时间复杂度、是否稳定。比如快排平均O(n log n)但最坏O(n²)归并稳定但是O(n)额外空间堆排不稳定这些是高频选择题素材。另外要能随手默写快排的原地partition这是编程题和面试手撕环节都喜欢考的点。二分查找也是常客但二分最坑人的不是思想而是边界。考场上一紧张left、right、mid的关系就乱了。我现在写二分固定用一套约定左闭右闭区间left0, rightn-1循环条件是leftrightmidleft(right-left)/2判断后修改区间时leftmid1或rightmid-1。这套写熟了以后即使题目变形也不会慌。2.2 字符串题KMP与next数组是高频考点字符串算法里KMP是笔试的“钉子户”。为什么它这么受欢迎因为它考察的点很综合要理解朴素匹配慢在哪要理解next数组的物理意义还要能写出线性复杂度的构造过程。这个算法不背不行但只背代码也不行因为题目稍微变一下next数组到底从0开始还是从1开始整个代码就对不上了。我建议把KMP彻底吃透不要只停留在“会背模板”的层面。你要能回答为什么KMP匹配失败时跳转到next[j]而不是从头开始next数组为什么可以递推得到模式串abacaba的next数组是多少以及是怎么一步步算出来的。这些如果都能脱口而出KMP相关的题目对你来说就只是送分题。除了KMP字符串题还经常涉及双指针、滑动窗口、字符串哈希、Manacher等。但这些都是建立在你会理解、会推导的基础上不是靠模板硬背。后面我会专门拿abacaba这个例子把next数组完整推导一遍。2.3 动态规划和贪心识别模型比硬推更靠谱动态规划是算法笔试真正的分水岭。有的人看到题就能写出状态转移方程有的人卡在“这题到底能不能用DP”这一步。我的经验是DP不是靠灵感而是靠模型积累。常见的模型反复出现——最长上升子序列、0-1背包、完全背包、编辑距离、区间DP、状态压缩DP——你每掌握一个模型就等于在脑子里多装了一个过滤器新题来了先看能不能套进去。贪心题则完全相反。DP是“多阶段决策每步都看未来”贪心是“每步都做局部最优然后证明全局最优”。笔试里的贪心题一般都有比较明显的特征比如区间调度、哈夫曼编码、部分背包。遇到贪心题我习惯先尝试猜一个策略然后用反证法或者交换论证法快速验证。如果验证不通过马上回头想DP不要在一个策略上死磕。爱奇艺这类视频平台的算法题里DP和贪心经常会披上业务的外衣。比如“给视频打标签的最少操作次数”“安排转码任务的顺序使总等待时间最短”但剥掉外壳后内核仍然是经典模型。所以刷题时不能只背题目要训练自己剥壳的能力。2.4 机器学习与深度学习基础算法岗的第二张考卷如果编程题考察的是“能不能写代码”那简答题考察的就是“懂不懂原理”。这部分爱奇艺的考察重点基本都在机器学习经典概念和深度学习基础理论上很少出那种需要大量公式推导的题但会问你一些“看起来简单但说不清楚”的问题。这类题有几个高频方向分类问题为什么用交叉熵而不用均方误差L1正则和L2正则有什么区别为什么L1会把参数推向稀疏什么是过拟合常用的避免措施有哪些K-Means聚类的原理、缺陷以及和DBSCAN的对比数据不平衡时应该用什么评估指标是准确率还是F1还是AUC。这些概念如果平时只是看过、没整理过考场上很难写出有条理的答案。我的建议是把每一个基础概念当成“要给一个刚入门的人讲明白”来准备。能讲明白写简答题才能拿高分。3. 典型真题完整推导与代码实现3.1 手算next数组全过程以模式串abacaba为例KMP这里我多说几句因为它太常考了。next数组的定义有几种变体考试时如果不给定义一般默认是next[i]表示当模式串第i位失配时应该跳转到模式串的哪个位置继续匹配。更常见的写法里next[0] -1next[i] 表示“模式串的前缀P[0..i-1]的最长相等真前后缀长度”。以p abacaba为例我把它拆开算一遍。下标从0开始字符串长度是7我们要求next[0]到next[7]其中next[7]在匹配到末尾后如果还需要跳转时用得上有些写法会算到长度。next[0]约定为-1表示第一个字符就失配模式串整体右移一位。next[1]看前缀P[0..0]a最长相等真前后缀长度为0所以next[1]0。next[2]看前缀P[0..1]ab前缀集合是{a,ab}后缀集合是{b,ab}真前后缀不能是整个串最长相等真前后缀长度为0所以next[2]0。next[3]看前缀P[0..2]aba前缀有a,ab后缀有a,ba最长相等的是a长度1所以next[3]1。next[4]看前缀P[0..3]abac前缀有a,ab,aba后缀有c,ac,bac没有相等的所以next[4]0。next[5]看前缀P[0..4]abaca前缀有a,ab,aba,abac后缀有a,ca,aca,baca最长相等的是a长度1所以next[5]1。next[6]看前缀P[0..5]abacab前缀有a,ab,aba,abac,abaca后缀有b,ab,cab,acab,bacab最长相等的是ab长度2所以next[6]2。next[7]看整个串abacaba前缀有a,ab,aba,abac,abaca,abacab后缀有a,ba,aba,caba,acaba,bacaba最长相等的是aba长度3所以next[7]3。所以next数组为[-1, 0, 0, 1, 0, 1, 2, 3]。实际代码里我们一般用递推方式生成不需要这样暴力比对。下面是一段C代码可以在O(n)时间内构建next数组vectorint build_next(const string p) { int m p.size(); vectorint next(m 1); next[0] -1; int i 0, j -1; while (i m) { if (j -1 || p[i] p[j]) { i; j; next[i] j; } else { j next[j]; } } return next; }这段代码的精髓在于j始终表示“已经匹配成功的前缀长度”当p[i]和p[j]相等时当前最长相等前后缀长度比之前多1不相等时j回退到next[j]继续尝试。如果你能看懂这段代码再回头理解next数组的推导会轻松很多。3.2 一道滑动窗口编程题最长连续不重复子串除了KMP这套笔试里常见的一类编程题是“字符串处理滑动窗口”。这类题很能区分选手思路大家都懂但能不能把代码写得干净、边界处理好是两回事。我以一道非常经典的题为例给定一个字符串找出其中不含有重复字符的最长子串的长度。比如输入abcabcbb答案是3因为abc是最长不重复子串输入bbbbb答案是1。这道题用滑动窗口解。窗口内维护一个哈希表记录每个字符最近出现的位置右指针不断向右扩展当碰到一个已在窗口内出现的字符时左指针跳到该字符上次出现位置的右边一格然后更新最长长度。下面是Python实现def length_of_longest_substring(s: str) - int: pos {} left 0 ans 0 for right, ch in enumerate(s): if ch in pos and pos[ch] left: left pos[ch] 1 pos[ch] right ans max(ans, right - left 1) return ans两个细节容易被忽略。第一个if里必须判断pos[ch] left否则左指针已经被窗口移过了旧的记录不该影响当前窗口第二个right - left 1算的是窗口长度不是right本身。有的同学会把ans更新写错累死也过不了样例。这类滑动窗口题的时间复杂度是O(n)空间复杂度O(min(n, 字符集大小))写完代码之后自己要在脑子里跑两个用例一个全重复的串一个全不重复的串。3.3 简答题的标准答法以“为什么分类用交叉熵”为例笔试简答题千万别写成名词解释阅卷人想看的是你“懂”还是“背过”。我的策略是三段式先给定义再做对比最后落到场景。举个高频例子为什么分类任务常用交叉熵损失而不是均方误差MSE。我的标准答法是交叉熵衡量两个概率分布之间的差异在分类问题里真实标签可以看作一个one-hot分布模型输出通过softmax变成一个概率分布交叉熵正好衡量这俩分布的距离。而MSE在配合sigmoid或者softmax使用时会出现梯度饱和——当预测值极端错误时梯度反而很小导致收敛很慢。交叉熵配合softmax求导之后形式是prediction - label梯度大小正比于误差学习效率高。然后落到场景在视频推荐场景里点击/不点击是二分类用交叉熵做损失函数配合AUC评估是比较成熟的方案。这样回答既有公式、有对比、有业务场景阅卷人一眼就能看出你不是临时背的。4. 考场上最容易踩的坑与补救方法4.1 时间分配编程题卡住超过40分钟一定要止损校招在线笔试一般给90到120分钟题量也不算大但最致命的问题是“死磕”。我见过太多人包括当年的我在第一道编程题上花了一个小时结果后面选择题和简答题完全没时间写白白丢分。我的经验是拿到试卷后先花两分钟把所有题扫一遍大致判断每道题的类型和难度。然后按“先易后难先分数多后分数少”的顺序做题。如果一道编程题想了25分钟一点思路都没有果断跳过去做后面的。别怕丢这一道题的分把能拿的分全拿到才是通过笔试的正确策略。而且跳过去之后大脑在后台还会继续处理这个题等做完其他题再回头看可能思路就冒出来了。还有一个技巧编程题如果只能写出暴力解也要写上去。很多在线笔试的判题机制不完全只看最终AC部分用例有部分分暴力解至少能过小数据。空着是零分暴力解是二十分这个账很好算。4.2 边界条件空数组、单个元素、负数、溢出我统计过自己刷题时犯的错大概有一半以上是边界条件没处理好。笔试时最容易出问题的几个点数组为空时你的代码会不会直接崩数组只有一个元素时循环条件会不会进入死循环字符串为空时滑动窗口返回的结果是不是0负数参与计算时除法和取模的符号是否符合预期整数相加会不会溢出int范围。这些问题的根源是“只在样例上验证没有自己构造边界用例”。写代码之前先花几十秒想清楚这题的边界形态长什么样然后用一句话写在草稿纸上写完代码后在脑子里跑一遍边界用例。这个习惯能帮你挽回到处几分钟的调试时间。4.3 输入输出的处理在线笔试和本地跑代码不同应届生第一次参加在线笔试时容易在输入输出上栽跟头。在线OJ对输入输出有严格约定多输出了一个提示字符串都会判错。最常见的输入形式是第一行一个整数T表示测试用例数量然后每个用例单独一个或两行。如果有多个用例要用while循环读直到EOF结束。另一个常见问题是本地代码里有一个大数组你想在main函数里开一个int a[1000000]结果编译没问题但运行崩溃。因为大数组要放在全局区不能放在函数栈里否则栈溢出。这些问题虽然看起来跟算法无关但实践里真的会因为这种低级错误丢分所以考前要拿平台模拟题练一下输入输出尤其是读取一行字符串时会不会把换行符也读进去。4.4 选择填空与简答的表述技巧选择题方面如果遇到不太确定的题用排除法加特殊值代入法。比如考排序稳定性你脑子里想一个只有两个元素(2a, 1, 2b)的数组手动模拟一遍排序过程看两个相等的2会不会改变顺序比抽象记忆稳定性的定义快得多。考场上的时间是宝贵的能动手算的题就别空想。简答题一定要分点作答用“第一、第二、第三”或者“1. 2. 3.”把逻辑链条列清楚。哪怕你有的点不确定也要用较严谨的措辞写出来阅卷人一般按点给分分点写的得分率通常高于大段文字。写公式时不用写一堆推导但是关键公式要写对比如交叉熵的公式、softmax的公式这些是硬通货。最后再分享一个小技巧复盘这套题的时候我最大的感受是校招算法笔试本质上不是拼天赋而是拼“基本功的肌肉记忆”。真正有用的训练方式不是把题海战术进行到底而是在每个经典模型上反复打磨到能闭眼写出来的程度。比如快排的partition、KMP的build_next、Dijkstra的优先队列实现、背包问题的滚动数组——你想了很久才能写出来和条件反射一样10分钟内写完考场上完全是两种心态。如果你准备时间有限我建议按这个优先级复习先把排序和二分吃透然后把KMP和滑动窗口这类字符串题刷熟练之后是动态规划的经典模型最后再过机器学习基础概念。这套体系覆盖了绝大多数大厂算法笔试的考点而不只是爱奇艺这一场。笔试过了也只是第一关面试手撕代码时面试官更看重你讲思路的能力所以平时练习时要养成边写边说的习惯把每一次做题都当成一场mini面试来对待。