
2019年秋招算法工程师笔试题是那一年技术社区里讨论最凶的话题。我自己前前后后投了三十多家公司的算法岗线上笔试做了二十多场线下笔试也参加了几场。最大的感受是笔试很少直接考你简历上写的“精通TensorFlow”“熟悉PyTorch”反而把大量篇幅留给数据结构、经典算法、数学推导和机器学习原理。有个同学第一场笔试就挂在KMP算法的next数组推导上这让我意识到基础题并不比其他题好拿分。今天不聊碎片面经我想把当时踩过的坑、总结出来的规律按考点模块完整梳理一遍给正在准备校招或打算转算法岗的朋友一份能直接照着复习的参考。1. 2019校招笔试全景算法题为什么成了最硬的敲门砖1.1 当年算法岗的供需变化笔试承担了什么角色2019年是人工智能岗位热度非常高的年份特别是算法工程师这个头衔几乎每个理工科背景的同学都想过辙投一投。结果就是一个稍微大点的公司放出算法岗简历收几千份很正常。面试官不可能挨个去聊笔试就成了第一道漏斗。我记得有的公司笔试淘汰率能到八成以上也就是说你花两小时做的卷子大概率是把大多数人筛掉。这里有一个很多同学容易误解的地方笔试不等于面试的加试它更像一个“准入考试”。面试官会先看笔试成绩再决定要不要捞你的简历。笔试如果不及格哪怕项目再亮眼简历这关也基本过不去。所以笔试的定位不是“秀肌肉”而是“别出错”。1.2 笔试题型分布选择题、简答题、编程题三者的真实比例2019年的校招算法笔试大部分公司还是在牛客网或赛码网上做时间通常是90分钟到120分钟。题型组合大概是30道左右选择题覆盖数据结构、数学概率、机器学习2到5道简答题写推导过程或解题思路2到3道编程题限时在编辑器里完成。选择题分值不一定高但量大考的知识面广。简答题往往是拉开差距的地方因为它考的不只是“会不会”还有“能不能说清楚”。编程题则是硬功夫做不出来就是做不出来没有凑分的机会。我整理过一张考点雷达表按出现频率排序大家可以参考频率考点模块常见题型高频排序与堆、KMP、贪心与动态规划、二分、链表操作选择题 编程题中高频K-Means聚类、KNN、逻辑回归推导、反向传播、交叉熵选择题 简答题中频贝叶斯与最大似然、信息熵与KL散度、粒子群/模拟退火选择题低频但会考音频重采样、图像锐化算子、规则引擎匹配算法、卡尔曼滤波、PID选择题 简答题这张表的启发是校招笔试并不是只考机器学习或深度学习数据结构和经典算法始终是主菜。这也是为什么有人刷了三个月LeetCode反而觉得笔试轻松。下面我从自己实际遇到过的题目出发按模块拆一遍。2. 数据结构与经典算法考场上永远绕不开的基本盘2.1 排序算法不背代码要会推导复杂度排序算法在算法岗笔试里很少让你完整默写快速排序更多是考“哪种排序在什么场景下适合”“堆排序的建堆过程是什么”“已知前序和中序怎么重建二叉树”。这几个问题看起来基础实际一写就容易错。比如堆排序的稳定性很多人会想当然认为堆排序稳定其实堆排序是不稳定的因为在建堆和交换的过程中相等元素的相对顺序可能被改变。另一个高频变形是Top K问题。有一道经典题100万个整数里找最大的100个怎么做很多答案会说“堆”但题目如果加了内存限制就需要考虑外部排序或者分桶。笔试考的不是你会不会用堆而是你在什么条件下还能用堆条件变了怎么办。这种追问才是失分点。2.2 KMP与字符串匹配next数组到底怎么推字符串匹配题我见过的几种考法直接要求手写KMP、给出模式串让你填next数组、或者让你解释为什么KMP是线性复杂度。其中“填next数组”看似送分实际错误率很高。以abacaba为例如果约定next[i]表示从模式串开头到下标i这一段的最长相等真前缀后缀长度可以这样推i0字符a没有真前缀next[0]0i1前缀ab最长相等前后缀为0next[1]0i2前缀aba前缀a等于后缀anext[2]1i3前缀abac没有相等前后缀next[3]0i4前缀abaca最长相等前后缀为1i5前缀abacab最长相等前后缀为2abi6前缀abacaba最长相等前后缀为3aba所以next数组是[0,0,1,0,1,2,3]。这里要注意有些教材把next[i]定义成“失配时模式串指针回退的位置”那样需要做整体偏移不同教材的最后结果形式不一样。考试时一定要先看清楚题目给的定义不然你按自己的习惯写阅卷直接判错。我当年就吃过亏一个简答题因为没写定义白白扣了分。2.3 贪心、Dijkstra、快速幂模板题怎么拿满分笔试里的编程题有一类是比较“标准”的比如活动安排、单源最短路、快速幂。这类题只要平时写过考场上是能拿满分的。以快速幂为例题目经常是“求a的b次方对mod取余”b可能高达10的18次方。很多第一次做的同学会写循环累乘复杂度O(b)直接超时。正确做法是用二进制的思想def quick_pow(a, b, mod): res 1 a % mod while b 0: if b 1: res (res * a) % mod a (a * a) % mod b 1 return res核心逻辑是把b拆成二进制a每次自乘得到a^2、a^4、a^8……遇到对应二进制位为1就乘进结果。这样复杂度从O(b)降到O(log b)。这类代码特别适合在笔试里当模板背熟能省下大量时间。贪心算法看的是“局部最优能不能推出全局最优”。活动选择问题里按结束时间排序就是经典做法但有些题目会故意设置陷阱比如背包问题就不能直接贪心需要用动态规划。考试时要学会判断一个题到底是贪心还是DP判断错了方向写的代码再漂亮也没用。2.4 堆排序与二分图HK算法进阶选手的加分项堆排序本身不难但笔试里常把“构建大顶堆”和“删除堆顶”的操作过程画成选择题。你要掌握下沉和上浮两种调整过程以及用数组表示完全二叉树时父节点和子节点的下标关系。二分图最大匹配的HK算法则属于进阶题出现的概率不是很高但一旦出现就是明显的区分度。如果你准备时间充裕建议把匈牙利算法看一遍HK算法至少要能说出思路和复杂度不要一上来就懵。3. 机器学习与深度学习从“会调包”到“能推导”的分水岭3.1 聚类与KNN笔试不喜欢“会调包”喜欢“能推导”很多在校同学的主力技能是调包一提聚类就是sklearn的KMeans一提分类就是KNeighborsClassifier。但笔试没法调用包它考的是“你会不会从零开始写”。比如K-Means最基础的问题是它的迭代流程先随机选K个中心然后每个样本归属到距离最近的中心再重新计算中心。你如果只回答“就按距离分一下”面试官会追问“如果某个簇空了怎么办”“初始中心怎么选”“收敛的判断条件是什么”。笔试里的选择题会直接考“K-Means相比K-Means改进了什么”答案是对初始中心的选取做了改进让初始中心尽量分散。KNN的考点集中在三要素距离度量、K值选择、分类决策规则。有一道高频题K值取得过大或过小分别有什么影响过小容易受噪声影响过大则会把类别边界拉平模型变简单。这种题不需要写代码但必须能用术语说清楚。3.2 深度学习基础反向传播、交叉熵、Attention深度学习相关题笔试常年考反向传播因为它考的是“你会不会推导梯度”而不是“你会不会用框架”。一个很常见的题目是给你一个两层的全连接网络输入一个样本让你手算权重W的梯度。这种题只要把链式法则拆开先算损失对输出层的梯度再往前传就能得分。交叉熵也经常和Softmax一起考。Softmax把logits转成概率交叉熵衡量预测分布和真实分布的差异。笔试里容易错的是为什么分类任务用交叉熵而不用均方误差因为交叉熵配合Softmax的梯度形式简单不容易出现梯度消失而MSE配合Sigmoid时在两端梯度接近于零更新很慢。这个问题如果只答“大家都这么用”基本拿不到分。2019年前后Attention机制已经很火笔试里会考它的基本思想Query和Key做相似度计算得到的权重作用在Value上。你不需要手写完整Transformer但至少要知道Attention输入是什么、输出是什么。3.3 强化学习与前沿概念少量题目大的区分度强化学习在2019年的校招笔试里出现频率不算高但头部公司很喜欢放一道相关选择题比如“MDP由哪几个要素组成”“Q-learning的更新公式是什么”。如果你完全没接触可能直接放弃如果学过这题就是白送的。Q-learning的更新公式可以理解为用下一步能得到的最大Q值来近似目标值然后以α的学习率去修正当前Q值。这样模型不需要完整的环境模型也能在探索中慢慢学到策略。另外像KL散度、ELBO这些概念在VAE、变分推断相关的题目里可能出现。核心要知道KL散度是不对称的它衡量两个分布的差异ELBO是证据下界优化ELBO等价于在似然和先验之间做平衡。这类细节点很难从项目经历里学到必须靠系统复习。4. 数学功底与经典算法模型看似冷门却拉分的“暗器”4.1 粒子群与模拟退火两道“看似送分”的题粒子群算法是经典群体智能优化方法笔试考它一般就两个点速度更新公式里每一项的含义、粒子的位置和速度怎么更新。速度更新有三部分惯性项保留原来的运动惯性个体认知项让粒子向自己历史最优位置靠拢社会认知项让粒子向群体最优位置靠拢。这样一群粒子在搜索空间里飞来飞去最后收敛到最优解附近。模拟退火算法的核心是Metropolis准则新解比当前解好就接受新解更差时也有一定概率接受这个概率随着温度降低而减小。它用来避免贪心算法陷入局部最优。笔试里常考“为什么温度高时要接受差解”答案是为了跳出局部最优在搜索早期保持多样性。这类题看似“冷门”其实正因为大多数人不复习反而成了拉分项。4.2 卡尔曼滤波与PID控制论思想在算法题中的位置卡尔曼滤波听起来像控制论的内容但算法岗笔试确实出现过。它在机器人定位、追踪、自动驾驶里都很常见。卡尔曼滤波的核心思想是“预测更新”先根据运动模型预测状态再用观测值去修正预测。笔试不要求你默写五大公式但要知道它解决的是“状态估计”问题以及它假设噪声服从高斯分布并且能把误差协方差一步步传播下去。PID算法更常出现在一道场景题里比如“无人机悬停高度有偏差你怎么调PID”。比例项负责纠正当下的偏差积分项负责消除长期累积的稳态误差微分项负责抑制变化趋势防止超调。能结合场景说明三个项的作用就足够拿分。说实话这类题属于“会者不难难者不会”。如果你时间紧至少要把卡尔曼滤波和PID解决的问题能一句话说清楚这样选择题碰到了也能蒙对。4.3 概率论与信息论KL散度、贝叶斯这些基础概念别只听过概率论是算法岗笔试绕不开的部分。贝叶斯公式、最大似然估计、期望、方差、正态分布的基本性质都是选择题常客。有一类题会给你一个先验再给几个观测让你算后验。这类题只要会套公式就能做但很多人因为太久没碰概率论连符号都看不懂。信息论里的熵、交叉熵、KL散度也是常考内容。KL散度用一句话解释P分布用Q分布来近似平均多出的信息量是多少。它不满足对称性所以D_KL(P||Q)和D_KL(Q||P)往往不相等。看到选择题里说“KL散度是对称距离”的直接可以排除。如果把这一部分和前面的机器学习联系起来你会发现很多算法本质都是在最小化某个损失而这个损失多半可以写成KL散度或交叉熵的形式。理解了这层关系笔试里很多推导题就能举一反三。5. 企业视角下的工程算法题当笔试遇上真实业务5.1 搜索与推荐场景BM25和排序思路的实战变形搜索和推荐是算法工程师最对口的业务之一笔试里出现BM25并不奇怪。BM25是一种信息检索排序模型给定一个查询词计算文档和查询的相关度。它比TF-IDF多考虑了词频饱和、文档长度归一化等因素。如果笔试出选择题通常会问“BM25中哪个因素负责处理长文档”答案就是文档长度归一化。还有一种常见变形是“给一个用户行为日志让你设计CTR预估的特征”。这种题考的不是某个具体算法而是特征工程的思路用户维度、商品维度、交叉维度、统计窗口。它提醒我们笔试不只是理论也在模拟真实业务里“如何把问题拆成可计算的流程”。有的公司还会考签名算法或加解密的基本流程比如对称加密和非对称加密的区别、哈希算法的应用场景这种题不需要你会逆向但要对常见的算法流程有概念。5.2 图像与音视频算法拉普拉斯锐化与重采样的考察路径图像算法在笔试里常以概念形式出现。拉普拉斯算子是二阶导数算子用来检测图像中的边缘灰度突变的地方响应值大。图像锐化常用原图减去或加上拉普拉斯滤波结果的某种组合视觉上边缘更清晰。音频重采样则是另一个方向比如把采样率从44.1kHz转到48kHz。除非特别高端的岗位一般不会让你重写重采样器但会考“为什么采样率转换需要低通滤波器”答案是为防止频谱混叠。这其实是在考你对奈奎斯特采样定理的理解。这类题给我们的信号是算法岗笔试的覆盖面很广除了计算机基础还会看你有没有工程感知能力。你不是在真空中写代码而是要和图像、音频、文本、日志这些真实数据打交道。5.3 规则引擎与工业异常检测Rete算法背后的模式匹配思想规则引擎的Rete算法严格说是后端工程的范畴但我在笔试里确实遇到过相关的概念题。Rete算法的核心是把规则拆成节点网络让多个规则之间的公共条件共享状态从而减少匹配次数。你可以把它理解成“用空间换时间的规则匹配优化”。工业异常检测是更贴近产业应用的题比如“生产线上有正常和异常样本正常样本远多于异常样本你用什么方法检测”。常见的思路有用自编码器重构误差、用孤立森林、或者用对比学习。笔试考这种题看的不是你会不会用某个库而是你有没有在面对“数据不均衡”时选择合适方法的意识。6. 我的备考复盘与临场经验6.1 刷题的正确姿势建立“题型-算法”映射很多人校招准备喜欢按LeetCode题号刷一天刷几十道但效果很差。我的经验是按主题刷并且刷完一道题后在笔记里写下“这道题属于哪类题型最优解是什么边界条件是什么”。比如看到“求一个无序数组第K大的元素”要能自动联想到快速选择或堆看到“有环链表的入口”要能自动联想到快慢指针看到“求两个字符串的最长公共子序列”要能自动联想到动态规划。这种“题型-算法”的映射建立之后笔试时看到题目就会有直觉反应省去大量思考时间。6.2 模拟笔试环境时间分配和代码习惯怎么练笔试不是比谁会背而是比谁在有限时间内拿分多。我建议至少在正式笔试前做五次完整模拟用牛客网或赛码网的模拟卷严格计时。模拟时注意三点第一选择题不要卡太久超过90秒还没思路就蒙一个把时间留给编程题。第二编程题先写暴力解保底再考虑优化至少不要交白卷。第三变量名和边界条件要养成肌肉记忆每次提交前检查一下数组越界、空输入、数值溢出。这里有一个真实教训我第一场笔试编程题第二题明明能做出来但因为在IDE里手贱加了个大括号没配对调试花了十五分钟最后没调试完就交卷了。从那以后我每道编程题都先写注释再写代码最后统一检查括号。6.3 考后复盘那道没做出来的题后来成了我面试的引子笔试结束不代表这件事就完了。我每场笔试后都会把所有错题和对应解法整理到一个文档里标注错误原因是知识点不会是看错题还是时间不够。这个文档在后续面试里帮了大忙。有一次面试官问我“你最近研究过什么算法”我直接把笔试时遇到的一个聚类分析题拿出来讲了讲我当时怎么想的、为什么没解出来、后来怎么补充的。面试官反而对这个诚实的复盘非常感兴趣追问了很多细节。所以我觉得没做出来的题不是减分项你愿不愿意去补、能不能讲清楚才是真正的加分项。最后再分享一个小技巧正式笔试前一天不要刷难题把KMP的next数组、快速幂、堆排序这些模板各写一遍让手热起来就够了。考场上遇到做不出的题深呼吸标记一下先把能拿的分拿稳。算法岗笔试拼的从来不是单题难度而是整体稳定性。