爱奇艺2020校招算法方向笔试题(第一场)——我当年也是从这套题里摸爬滚打出来的。很多同学私信问我大厂算法岗笔试到底考什么,我翻了翻当年的记录,发现这套题特别有代表性:它不光是考你“会不会写代码”,更多是考“你有没有算法思维”。尤其是那些看起来基础的数据结构题,稍不留神就会掉进坑里。这篇文章我就从这套题出发,把算法岗笔试里最常出现的几类考点——KMP、排序、贪心、机器学习基础、信号处理算法、工程安全算法——逐个拆开讲,附带我当时踩过的坑和总结的应考思路。无论你是正在备战秋招的应届生,还是想转行做算法的工程师,这篇都能给你一些参考。
1. 算法岗笔试不是刷题竞赛:从爱奇艺这套题看考察逻辑
先说一个很多人容易搞错的认知:算法岗笔试和开发岗笔试的筛选逻辑完全不一样。开发岗笔试重点看你能不能把功能写出来,代码能不能跑通;但算法岗笔试更看重的,是你面对一个模糊问题时,能不能把它抽象成数学模型,能不能选出合适的算法,能不能考虑到边界条件和复杂度瓶颈。爱奇艺2020校招这一场,表面看是“算法题”,实际上是在用题目筛选“具备算法素养的人”。
我记得当时的题目结构大致分三块:基础数据结构与算法、机器学习/深度学习基础、少量工程交叉题。这种配置在大厂算法岗里非常典型。为什么要这样设置?因为算法岗日常工作并不是天天推公式、调模型,更多时候是在处理数据、优化检索流程、设计特征、调参、评估效果。你需要懂数据结构来写高效的工程代码,需要懂机器学习原理来解释模型行为,还需要有足够的数学功底来理解损失函数、正则化、复杂度分析的来龙去脉。
还有一个容易被忽视的点:这套题里很多名词在当时的“热门算法清单”里都能找到影子,比如KMP、粒子群、PID、卡尔曼滤波、重采样、BM25、Rete算法等等。这说明什么?说明大厂出题不是只盯着leetcode,而是会结合自己的业务场景来发散。爱奇艺做视频,音频重采样、图像处理、推荐排序都是实际需求;腾讯视频那套ckey签名算法也被拿来讨论,本质上是想知道你有没有工程安全意识。所以备考算法岗,不能只看题,还得理解这些算法在真实业务里解决什么问题。
我自己的体会是,算法岗笔试更像一场“压力下的思维体检”。题目不一定多难,但范围特别广,时间又紧。比如给你一个KMP的next数组题,你不仅要会算,还要能解释这个数组的意义;给你一个排序算法题,你要知道为什么某些场景下快排会退化、为什么归并排序是稳定的。这些“为什么”才是笔试真正的区分度所在。
所以这篇文章,我不打算只给你“答案”,而是带你把每个核心考点背后的逻辑、原理、实际应用梳理清楚。这样无论题目怎么变,你都能找到对应的解题思路。
2. 数据结构与经典算法:KMP、排序与贪心的实战考法
2.1 KMP算法的next数组:定义不同,答案完全不同
热词里有一道很经典的题:模式串 p="abacaba",next数组怎么求。很多人一上来就懵,原因是next数组有“从0开始”和“从1开始”两种定义,不同教材、不同出题人给的规则不一样,算出来的结果可能完全不同。
先说清楚一个核心概念:next数组记录的是“当匹配失败时,模式串应该回退到哪里”。它本质上是在利用已经匹配的前缀和后缀信息,避免从头再匹配。对于"abacaba"这个串,我们先求它的前缀后缀最长公共长度,也就是常说的PMT(部分匹配表):
| 位置i | 字符 | 前缀后缀最长公共长度 |
|---|---|---|
| 1 | a | 0 |
| 2 | ab | 0 |
| 3 | aba | 1 |
| 4 | abac | 0 |
| 5 | abaca | 1 |
| 6 | abacab | 2 |
| 7 | abacaba | 3 |
如果next数组定义为“当前位置之前的最大公共前后缀长度”,那结果就是:
next[1] = 0 next[2] = 0 next[3] = 1 next[4] = 0 next[5] = 1 next[6] = 2 next[7] = 3但如果题目把next定义为“失配时移动到的位置”,通常会整体左移一位,即next[1]=-1,然后next[i]=前一个位置的最长公共长度。这种情况下答案会是-1, 0, 0, 1, 0, 1, 2。两种答案没有谁对谁错,关键是你在考场上一定要先看清楚题目给的定义。我当年就吃过这个亏,上来默认按第二种算,结果题目要求的是第一种,丢了一道送分题。
KMP的实用性在笔试中其实被高估了,它更多是考察“你是否理解字符串匹配为什么能加速”。我建议准备时把next数组的构建代码自己写一遍,别只看不练。构建过程本质是“用模式串匹配自己”:
vector<int> buildNext(string p) { int m = p.size(); vector<int> next(m, 0); int j = 0; for (int i = 1; i < m; i++) { while (j > 0 && p[i] != p[j]) { j = next[j - 1]; } if (p[i] == p[j]) j++; next[i] = j; } return next; }这段代码里最核心的是while循环里的回退逻辑:它不是在i前面来回找,而是利用已经算好的next数组,把j跳到之前最长匹配的位置。理解了这个,KMP基本就通了。
2.2 排序算法:考试不考“会不会写”,考“为什么选它”
排序是校招笔试的常客,但爱奇艺这类大厂很少直接让你手写一个快排,更多是给你一个场景,问你应该用哪种排序。热词里出现的“冒泡排序c++”“堆排序算法”“排序算法”其实都在提示一个方向:你得把各种排序的复杂度和稳定性背得滚瓜烂熟,还得知道它们适合什么场景。
我整理了一个表,笔试前值得反复看:
| 排序算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|
| 冒泡排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
| 快速排序 | O(n log n) | O(n^2) | O(log n) | 不稳定 |
| 归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 |
这里面最容易被忽略的两个点:第一,快速排序为什么在最坏情况下会退化到O(n^2)?因为每次选基准值时如果都选到最大或最小元素,分区严重不平衡。所以实际工程里会用“三数取中”或随机选取基准来避免这个问题。笔试如果问你“快排什么时候最慢”,这个答案一定要答到。
第二,归并排序虽然平均和最坏都是O(n log n),但它需要O(n)的额外空间。为什么归并排序是稳定的?因为它在合并两个有序子数组时,当左右两边的元素相等,它先取左边的元素,这样就保持了相对顺序。而快排在交换元素时,可能把相同元素的相对位置打乱,所以不稳定。堆排序也是同理,建堆和堆调整过程中的交换也会破坏相对顺序。
2.3 贪心算法和动态规划:怎么快速判断一道题该用哪个
贪心和DP是算法岗笔试的“胜负手”题目,一般不会出现在选择题里,而是直接让你写代码。热词里“贪心算法”单独出现,说明这类题在当年的搜索热度非常高。
判断一道题该用贪心还是DP,我的经验是看“局部最优是否能推导出全局最优”。如果能,就大胆用贪心;如果不能,就需要DP把所有状态枚举出来。经典的活动选择问题就是贪心的典型:按结束时间排序,每次都选结束时间最早的、和已选活动不重叠的活动。为什么这个策略是对的?因为结束时间越早,剩余时间就越多,留给后面的活动空间越大。这种“每一步都做出当前看起来最优的选择,最终得到全局最优”的题目,就用贪心。
而像“背包问题”这类,局部拿价值最高的物品不一定能得到全局最优,因为背包容量是有限的,你还要考虑“性价比”。这种就需要DP,用dp[i][j]表示前i个物品在容量j下的最大价值。
笔试中DP题通常不会太变态,但边界条件特别容易出错。我建议你把“状态定义、状态转移方程、初始值、遍历顺序”四件套列清楚再动手。比如01背包的状态转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),很多人写代码时会把i和j的遍历顺序搞混,导致答案错误。一个很实用的技巧是:先用二维数组把逻辑写对,在确认结果正确后,如果想优化空间,再改成一维数组并注意j从大到小遍历。别一上来就写一维数组,那样容易把自己绕晕。
2.4 图论与高级数据结构:Dijkstra、拓扑排序、快速幂
除了字符串和排序,图论也是算法岗笔试的高频区。热词里的“dijkstra算法”“kahn算法”“二分图hk算法”“快速幂算法c++”都在这个范畴。
Dijkstra算法考察的核心是“贪心+优先队列”的组合:每次从未处理的节点中取出距离起点最近的一个,然后松弛它的邻居。为什么需要优先队列?因为如果每次都用线性扫描找最小值,整个算法时间复杂度会是O(V^2),在稠密图上还可以接受,但在稀疏图上就会很慢。用优先队列可以降到O(E log V)。笔试如果让你实现Dijkstra,我建议直接写“优先队列优化版”,这是最稳妥的答案。
拓扑排序的Kahn算法则是BFS的经典应用:每次从图中删除一个入度为0的节点,把它加入拓扑序列,同时更新邻居的入度。如果最终拓扑序列的长度不等于节点总数,说明图里有环。这道题在笔试里通常不会直接问“什么是拓扑排序”,而是会给一个任务依赖场景,比如“课程表的选修顺序”“项目任务的先后关系”,让你判断是否存在环或输出一个合法的顺序。
快速幂是另一个很容易被忽略的送分题。它的核心思想是把指数按二进制拆解,将O(b)次乘法优化到O(log b)次。比如计算a^13,13的二进制是1101,所以a^13 = a^8 * a^4 * a^1,只需要四次乘法就够了。笔试中出现快速幂不一定直接问,更多是作为大数取模运算的基础,比如计算“a的b次方模m”。这里有个关键细节:每一步乘法后都要取模,防止溢出。
3. 机器学习与深度学习:算法岗笔试的“分水岭”区域
3.1 从KNN到聚类:无监督学习的高频考点
热词里有一条很具体的题:“knn算法的应用能力包括哪三个方面”。我记得标准答案一般是:分类、回归、异常检测(或者说是密度估计)。KNN是典型的“懒惰学习”算法,训练阶段其实什么都没做,只是把数据存下来;预测阶段才对每个样本计算它和所有训练样本的距离,取最近的K个邻居投票。这也是它最大的缺点:预测时间复杂度是O(n),数据量大了之后非常慢。
笔试里KNN常见的延伸考点有三个:一是K值怎么选,太小容易过拟合,太大容易欠拟合;二是距离度量方式,欧氏距离、曼哈顿距离、余弦相似度分别适合什么场景;三是数据标准化的重要性,因为KNN是对距离敏感的算法,如果某个特征取值范围特别大,它会主导距离计算,导致其他特征失效。爱奇艺这种公司出KNN题,很可能后面还会问“如果训练数据有几千万条,KNN还能用吗”,这时候你要答出来近似最近邻方案,比如KD树、球树或者局部敏感哈希。
聚类方面,K-means是必考。它的流程大家都知道:随机选K个中心,迭代分配样本到最近中心,重新计算中心,直到收敛。但笔试爱考的是一些容易被忽略的细节。比如初始中心怎么选?“K-means++”是通过让初始中心互相离得尽可能远来选择。K值怎么确定?常用的方法是“肘部法则”,画出成本函数随K变化的曲线,找到下降速度明显变缓的“肘部”。K-means本身是NP难问题,实际运行得到的是局部最优解,所以通常要多次随机初始化取最好结果。这些“细节”才是笔试的得分点。
3.2 集成学习与XGBoost:为什么它比GBDT更受青睐
热词里的“xgboot算法”其实就是XGBoost。在算法岗笔试里,XGBoost几乎是必考高频词,而且题目往往不会只停留在“XGBoost是梯度提升树”这个层面,而是会深入问“XGBoost在GBDT的基础上做了哪些改进”。
我记得当时答得比较全的是这四点思路:第一,XGBoost在目标函数里加入了正则化项(叶子节点的数量和相关L2模的平方),用来控制模型复杂度,降低过拟合风险;第二,XGBoost用二阶泰勒展开来近似损失函数,相当于不仅用了梯度,还用到了损失函数的二阶导信息(海森矩阵),这使得优化更精确;第三,XGBoost在特征选择和分裂点寻找上支持列采样,类似随机森林的做法,不仅能减少计算量,还能提高模型的泛化能力;第四,XGBoost对缺失值有自动处理机制,通过稀疏感知算法自动学习缺失值分裂方向,不需要像传统GBDT那样提前做复杂的填充。
掌握到这一步还只是“及格线”。如果笔试中有简答题,很可能还会问“XGBoost和LightGBM有什么区别”,这时候你要能说出LightGBM的直方图算法、GOSS(基于梯度的单边采样)和EFB(互斥特征绑定)三个核心优化。我当时在笔记里给它们排了个序:XGBoost胜在精度和稳定,LightGBM胜在训练速度和内存占用。
3.3 粒子群与模拟退火:别再觉得它们“只出现在论文里”
热词里“粒子群算法原理”“模拟退火算法”占了两个位置,说明它们在当年的算法笔试里讨论度很高。很多人觉得这些元启发式算法只在科研里用,笔试不需要准备,其实不对。大厂笔试偶尔会出一两道简答题,让你“简述粒子群优化算法的流程”,或者“与梯度下降法相比,模拟退火的优势是什么”。
粒子群优化(PSO)的原理可以这样理解:想象一群鸟在找食物,每只鸟都知道自己当前的位置和速度,也知道自己找过的最好位置(个体最优pBest),还知道整个群体找过的最好位置(全局最优gBest)。每次迭代,每只鸟的速度都朝着pBest和gBest两个方向调整,位置也随之更新。核心公式就两个:
v_i = w * v_i + c1 * r1 * (pBest_i - x_i) + c2 * r2 * (gBest - x_i) x_i = x_i + v_i其中w是惯性权重,控制的是对之前速度的继承程度;c1是认知学习率,c2是社会学习率;r1和r2是[0,1]的随机数。笔试如果问“PSO和梯度下降的区别”,核心回答点是:梯度下降需要损失函数可导,能找到局部最优解;PSO不需要梯度信息,只要定义好适应度函数就能搜,而且是通过群体协作来跳出局部最优,更适合离散、非凸、不可导的优化问题。
模拟退火则是从物理中的金属退火过程得来的灵感。核心在于Metropolis准则:如果新解比当前解好,一定接受;如果新解比当前解差,也要以一定概率接受,这个概率随着温度的降低而减小。这种“以退为进”的策略允许算法跳出局部最优,在早期“高温”阶段大胆探索,后期“低温”阶段收敛到最优解附近。笔试如果问“模拟退火的关键参数”,你要答出初始温度、降温速率、终止温度三个,并解释它们对搜索行为的影响。
3.4 深度学习基础:ELBO、KL散度与强化学习的入门考点
热词里的“kl elbo 算法原理详解”和“强化学习算法”看起来高大上,但在笔试里通常只会考察基本概念。KL散度描述的是两个概率分布之间的差异,它不是对称的,即KL(P||Q)不等于KL(Q||P),所以不能当作真正的距离度量。ELBO(证据下界)是变分推断里的核心概念,它是因为很多模型的边缘似然P(x)很难直接计算,所以转而去最大化一个下界,这个下界就是ELBO。如果笔试给你一个“推导VAE损失函数”的题,本质上就是要你用重参数化技巧来优化ELBO。
强化学习的入门考点则集中在:Agent、环境、状态、动作、奖励这几个基本元素;MDP(马尔可夫决策过程)的构成;策略和值函数的概念;以及“探索与利用”的权衡。我记得爱奇艺这套题如果涉及强化学习,大概率是给一个推荐系统的场景,让你讨论“如何平衡给用户推荐熟悉的内容(利用)和尝试新内容(探索)”。这种题没有标准答案,关键是你能不能用RL的语言把问题描述清楚。
4. 信号处理与控制算法:容易被忽视的交叉考点
4.1 音频重采样:视频公司笔试里的“意外之喜”
热词里有一条“音频重采样算法”,这可能让很多备考的同学摸不着头脑。但你要是换位思考一下爱奇艺的业务场景就明白了:视频平台要把不同采样率的音频统一到某个标准采样率去处理,就需要重采样算法。笔试里如果出现这个名词,大概率不是让你手推Sinc插值公式,而是考察你对“采样率转换”基本思路的掌握。
音频重采样的本质是:用插值算法在原始采样点之间计算出新的采样点。最简单的线性插值适合实时性强的场景,但会造成高频成分损失,音质一般;高质量的场景会用多相滤波器组或者基于Sinc函数的插值,同时搭配抗混叠低通滤波器。笔试如果问“重采样时为什么需要低通滤波器”,答案是防止频谱混叠。只要采样率低于信号最高频率的两倍,就会发生混叠,低频成分会被高频成分污染。
4.2 图像锐化与Sobel算子:卷积在图像处理中的直观体现
图像算法是视频平台笔试的常客,“sobel算法”就属于这一类。Sobel算子是一个离散微分算子,用来计算图像灰度的近似梯度。它在水平方向有一个3x3的卷积核,垂直方向有另一个。两个核分别是:
水平方向 Gx: -1 0 1 -2 0 2 -1 0 1 垂直方向 Gy: -1 -2 -1 0 0 0 1 2 1把这两个核分别和图像做卷积,就得到了每个像素在x方向和y方向的梯度,最终梯度幅值可以近似为 abs(Gx) + abs(Gy),也可以取平方和开根号。Sobel算子通常用来做边缘检测的预处理,也会用在图像锐化中:原始图像减去拉普拉斯算子的结果可以让边缘更突出。笔试如果给你一道“计算出某个像素经Sobel算子处理后的值”,你只需要理解卷积的计算步骤即可,关键是注意边界像素的处理,一般会补零。
4.3 PID、卡尔曼滤波和控制类算法的出现逻辑
热词里的“pid算法”“卡尔曼滤波算法”“mppt算法”“foc算法”走的是另一条线,这些通常出现在偏硬件、偏控制的岗位笔试中。但爱奇艺这种互联网公司为什么也在热词里?因为算法岗的考察范围越来越广,尤其是AIoT、智能硬件部门,需要会写控制算法的候选人。了解这些算法,哪怕不是你的主攻方向,也能在笔试的开放题里显示出你的工程广度。
PID大家应该不陌生,核心就是比例、积分、微分三个环节。比例环节决定“响应速度”,但太大会震荡;积分环节消除稳态误差,但容易导致超调;微分环节预见误差变化趋势,能抑制震荡,但对噪声敏感。笔试如果问“怎么调PID”,考察的就是你对这三个参数作用的直观理解,我整理了一个经验方向表:
| 参数 | 调节过大时的现象 | 调小时的现象 |
|---|---|---|
| P 比例 | 超调、震荡、响应变快 | 响应迟缓、稳态误差偏大 |
| I 积分 | 超调增大、甚至发散 | 稳态误差无法消除 |
| D 微分 | 对噪声敏感、系统抖动 | 抑制超调能力下降 |
离散PID的公式也建议背下来:
u(t) = Kp * e(t) + Ki * Σ(e(t)) + Kd * (e(t) - e(t-1))卡尔曼滤波则是“最优状态估计”的经典算法。它的核心思想是:把系统自身的运动模型(预测)和传感器的测量值(更新)加权融合,权重由两者的协方差决定。预测阶段用状态转移方程推算出下一步的状态和协方差;更新阶段计算卡尔曼增益,然后修正预测值。笔试如果考到,通常会让你写出状态转移和观测更新两个方程组,并解释卡尔曼增益的物理含义——它表示“我更相信模型的预测,还是更相信传感器的测量”。用在视频tracking场景里,卡尔曼滤波就是去预测目标框的移动,在下一帧检测结果出来之前给出一个“先验位置”。
4.4 推荐系统与检索算法:BM25和信息排序的基础逻辑
很多算法岗笔试都会涉及推荐或搜索排序,热词里的“bm25算法”就是信息检索领域的经典排序函数。BM25在TF-IDF的基础上做了三件事:第一,对词频做非线性饱和处理,因为词频超过某个阈值后,对相关性的贡献会递减;第二,引入文档长度归一化,抑制长文档的天然优势;第三,用可调参数控制词频和文档长度的影响力度。核心公式里通常有几个经典参数:k1控制词频饱和的速率,b控制文档长度归一化的程度,一般k1取1.2到2.0,b取0.75。
如果你在笔试里碰到“如何评价两个文档和query的相关性”,可以从TF-IDF答起,然后自然过渡到BM25,说明后者在工程中更常用,因为它在词频过高时不会让分数无限上涨,更符合真实的检索场景。
5. 工程与安全算法:从Rete到SM系列,笔试中的“加分题”
5.1 规则引擎与Rete算法:面试官想考察你的工程抽象能力
热词里“规则引擎drools的rete算法实现原理和事实匹配过程”特别长,一眼就能看出是某个同学搜索过的真题。Rete算法是规则引擎的核心匹配算法,它把规则编译成一个网络结构,缓存中间匹配结果来避免重复计算。你可以把它理解成一个“用空间换时间”的通用思路:当让大量事实与多条规则匹配时,很多子条件是重复的,Rete算法把这部分公共子条件提取出来共用,这样新事实进来时,就不需要把所有规则重新跑一遍。
笔试如果考到Rete算法,最关键的是讲清楚alpha网络和beta网络的差别。alpha网络做的是对单个事实的条件校验,比如“事实的类型是什么、某个字段的值是什么”;beta网络则负责把多个事实做join操作,比如“A事件和B事件按某个字段关联”。新事实进入后,往往只需要沿着网络结构走一遍,把缓存里的中间状态更新一下就行,匹配效率会显著提升。
5.2 BM25、签名算法与国密SM系列:看似冷门的工程考点
热词里“腾讯视频ckey5.x算法_php版”是个很特殊的词条。它说明当年的算法笔试确实会碰到商业平台的签名/防盗链算法相关题目。这类题通常不是让你去破解什么,而是给你一个签名生成的场景,让你设计一套防御思路,比如加时间戳防重放、加用户ID和设备信息形成指纹、对参数排序后拼接并做哈希摘要。
安全算法方面,国密系列也是值得了解的内容。SM2是基于椭圆曲线的公钥加密算法,类似RSA但更安全,用于数字签名和密钥交换;SM3是密码杂凑算法,输出256位摘要,可以理解为国产的SHA-256;SM4是对称分组加密算法,用于数据加密存储和传输。ZUC则是面向移动通信的流密码算法。笔试如果涉及“安全哈希与算法”,你要清楚这三类密码算法的分工,以及“哈希算法与加密算法有什么本质区别”——哈希是不可逆的摘要,加密是可逆的变换。
这里还延伸出一个经典安全问题:“SSL证书使用了弱哈希算法(CVE-2005-4900)怎么修复”。如果你的笔试题里出现这个,答案核心是:将证书签名算法从SHA-1升级到SHA-256或更高强度,替换服务器端的证书,并检查客户端和服务端协议配置中是否还允许SHA-1。这类题考的不是你会不会openssl命令行,而是你有没有“弱算法需要被淘汰”的安全意识。
5.3 工业与光学算法:MPPT、FOC和异常检测的支线知识点
热词里“mppt算法”“foc算法”“工业异常检测算法”“eva-02分类算法”“图像分类算法”涉及智能硬件和AI视觉方向。MPPT是光伏逆变器里最大功率点跟踪算法,常见的有扰动观察法和电导增量法;FOC是电机控制中的磁场定向控制算法,核心是把三相电流变换到d-q旋转坐标系,近似成直流电机来控制。这类题如果在笔试里出现,多半是开放性的“算法选型”题,比如“要在资源受限的嵌入式设备上实现实时控制,你会选什么算法”,这时候FOC、增量式PID就比复杂神经网络更合适。
工业异常检测则对应近年来很热的“小样本无监督异常检测”。“EVA-02分类算法”是视觉领域的大模型主干网络,考察你关不关注前沿。但笔试不会让你手推EVA-02的结构,它想知道的只是你是否了解预训练模型、微调和迁移学习的基本逻辑。我的建议是,对这类前沿算法不必深挖细节,但看到名词时要知道它是做什么的、大致思路是什么,能说上两句,就足够应对笔试里的概念选择题了。
6. 笔试现场的时间分配与答题顺序策略
技术储备再足,如果考场上时间分配失误,一样会翻车。我根据爱奇艺这场笔试的经验,给后来人几条可操作的策略。
第一,先整体扫一遍所有题目,给自己一个“难度梯度”判断。不要从第一题按顺序死抠到底,笔试时间通常是按题目总数平均分配的,但难度并不均匀。我习惯先把选择题和简答题中会做的快速做完,立刻拿下“基础分”,再集中精力攻克编程题。第二,编程题里如果卡住了,先写暴力解法再逐步优化,不要一直纠结最优解。在笔试评分里,部分通过通常有对应分数,能跑通一个O(n^2)的解法拿到80%的分数,比空着不得到一个无从下手的O(n log n)要强得多。第三,答题时,代码之外一定要写思路注释和复杂度分析。阅卷往往看你的解题思路,有时甚至比代码本身更重要。就算代码有bug,清晰的注释也能帮阅卷人理解你的意图。
另一个容易被忽略的坑是:题目要求“写代码实现某算法”时,一定要先在注释里写出“时间复杂度”和“空间复杂度”,尤其是在使用了递归、动态规划这种容易堆栈溢出或超内存的方案时,主动分析复杂度会明显提高你的专业性评价。我记得当年交卷前才发现有一道编程题用了递归写法,如果题目给的测试数据足够大,大概率会栈溢出,幸好提前转成了迭代版本,才避免翻车。
还有一个经验是:笔试过程中保持“边做边记录”的习惯。不是让你抄题,而是把解题中的关键假设、边界条件、复杂度分析简要写在代码注释或答题区,这样当你中途被其他题目打断再回来时,能快速恢复上下文。同时,如果做完后还有时间,优先检查编程题的边界条件,例如空数组、数组长度为1、负数、极大数溢出等情况,这些是笔试扣分最集中的地方。
说到底,爱奇艺2020校招算法方向这套笔试题,与其说是一套题,不如说是一个信号:大厂算法岗要的不仅是会刷题的选手,更是能把算法和工程场景结合起来的综合型候选人。热词里那些看起来零散的概念——KMP、粒子群、重采样、PID、BM25、SM系列——恰恰构成了算法岗知识体系的横切面。希望这篇拆解能帮你在准备笔试时少走一些弯路。我也一直觉得,备考算法岗最有价值的部分不是最后拿到的offer,而是那个过程中真正搞懂的每一个算法的“为什么”,这些积累会在你未来处理真实业务问题时,一点一点变成你的底气。