ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

2019算法岗笔试真题复盘:高频考点与备考策略全解析

2019算法岗笔试真题复盘:高频考点与备考策略全解析 2019年的校园招聘算法工程师笔试是我那年秋招印象最深的一道坎。算法岗投递量大笔试基本是海选的第一道闸门一套卷子答不好简历再漂亮也进不了面试。我前后做了三十多套笔试题整理下来发现考点高度集中数据结构与基础算法、机器学习理论推导、深度学习基本功、概率统计和智力题外加两到四道手写编程题。这篇文章就把我当时复盘的高频考点和踩坑经验完整梳理一遍适合正在准备算法岗校招的应届生也适合想了解算法笔试真实难度的在职朋友。内容以2019年真题为主线但很多题到现在依然频繁出现。1. 2019年算法岗笔试全景复盘题型构成与考察逻辑1.1 一套卷子里最常见的题型结构大部分公司的算法笔试由三类题型组成客观题单选加多选二十到四十道覆盖数据结构、机器学习、概率统计、深度学习、简答推导题部分公司会出数学推导或方案设计比如手推逻辑回归梯度、设计一个推荐召回方案、编程题两到四道需要自己处理输入输出。这三种题型的分数占比差别很大有的公司客观题占一半编程题只有一题有的公司编程题占大头客观题只是过场。各厂风格差别很大。我当年投了互联网公司、硬件公司、金融机构的技术岗体验最明显的几家字节的题特别重编程难度直逼CPC入门赛四道题能做出来两道就算稳华为偏重基础数据结构卷子里有排序、栈和队列的组合应用偶尔还会加一道工程场景题阿里和美团更看重机器学习推导与场景设计简答题的分值很高百度则喜欢把深度学习和工程落地结合起来考。所以不要用同一套复习资料应对所有公司先搞清楚目标公司的风格再分配精力。1.2 从考点频率看笔试的真正筛选逻辑我把当年整理的真题考点频率做过一个粗略统计出现次数最多的不是偏怪难题而是“基础加细节”。高频考点依次为排序与查找、KMP字符串匹配、贪心与动态规划、二叉树遍历与重建、逻辑回归推导、SVM原理、聚类算法评估、KNN细节、卷积计算与感受野、反向传播手算、贝叶斯与期望题。为什么笔试偏爱这些因为算法工程师的核心能力要求是能快速识别问题类型并写出可运行的代码以及能对自己的模型做推导解释。笔试题考察的是“能不能动手做”而不是“知不知道名词”。很多同学挂在第一轮不是因为不会难题而是基础题细节扣分太多。比如快排的partition写错边界或者逻辑回归损失函数里的符号写反这类错误在笔试里没有解释机会直接丢分。2. 数据结构与基础算法高频真题复盘2.1 KMP的next数组怎么算拿“abacaba”完整跑一遍当年几乎每套卷子都有KMP相关题最经典的问法是对于模式串 pabacaba求next数组。next[i]的定义通常在题目里会给当前字符失配时模式串应该回退到的位置等价于长度为i的前缀子串的最长相等真前缀后缀长度。我建议用手写模拟的方式记忆别死背代码。pabacaba从下标0开始i0next[0]-1这是约定。i1前缀a最长相等前后缀长度为0next[1]0。i2前缀ab前缀a和后缀b不相等next[2]0。i3前缀aba前缀a等于后缀a长度为1next[3]1。i4前缀abac长度1不成立a和c长度2不成立ab和acnext[4]0。i5前缀abaca前缀a等于后缀a长度为1再看aba和aca不等next[5]1。i6前缀abacab长度为2时前缀ab等于后缀ab成立长度为3时aba和cab不等所以next[6]2。i7整个串abacaba长度为3时前缀aba等于后缀aba成立长度4时abac与caba不等长度1虽成立但取最长next[7]3。如果题目把next[i]定义为“前i个字符组成的子串最长相等前后缀长度”结果就是 [-1, 0, 0, 1, 0, 1, 2, 3]。笔试里常问的另一个坑是KMP的时间复杂度为什么是O(mn)。关键在于匹配过程中主串指针不回溯模式串指针按next回退总回退次数不超过模式串长度所以整体线性。能把这个道理讲清楚比单纯背模板更稳。2.2 排序算法手写快排、堆排和TopK的真实场景排序是每年笔试的必出题。最常见的考法不是让你选复杂度而是要求手写快排并处理边界。快排的写法虽然烂大街但坑不少递归出口必须是 left right 就返回选择基准时最简单是取中间位置元素或者用三数取中避免有序数组退化分区时两个while的顺序要注意如果基准在左边从右往左找小的先走否则会出错快排最坏时间复杂度O(n²)平均O(n log n)空间复杂度是递归栈深度O(log n)。堆排序的考点在于建堆是O(n)不是O(n log n)。很多人会错。一个小根堆建堆的过程是从最后一个非叶节点开始下沉。TopK问题当年考得很频繁最标准的问法10亿个数找最大100个。答案就是用大小为100的小根堆遍历一遍每个数跟堆顶比较比堆顶大就替换并下沉。时间复杂度O(n log K)。如果不要求稳定用快排思想的partition也可以做到平均O(n)但工程上堆方案最稳。2.3 贪心与动态规划题型识别和典型题模版贪心和DP在笔试题里占大头。区分它们的一个技巧当前选择是否影响后续状态。如果局部最优能推出全局最优大概率是贪心如果存在重叠子问题需要记录状态就是DP。2019年出现过的典型贪心题有区间调度按结束时间排序、分发饼干、加油站问题。区间调度是必讲题型——按结束时间排序后能选的区间就选选了就更新end这题的贪心证明可以一句话说清每次选结束时间最早的区间能为后面的区间留下最大空间。DP的经典题集中在背包、最长上升子序列、编辑距离。笔试爱考的是状态定义和转移方程比如编辑距离dp[i][j] 表示 word1 前i个字符到 word2 前j个字符的最少编辑次数。转移时如果字符相等dp[i][j]dp[i-1][j-1]否则等于增、删、改三种操作的最小值加1dp[i][j]1min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1])。这类题目建议考前手写两遍因为代码量不大但细节多。2.4 图算法Dijkstra、并查集与最短路的变形图算法在笔试题里出现的频率没有动态规划高但一旦出现就是拉开差距的题。Dijkstra是高频考点。手写时要注意用优先队列优化dist数组初始化为INF起点dist为0每次取出距离最小的未访问节点松弛邻居。复杂度O((VE)logV)。如果边权为负数就不能用Dijkstra要用Bellman-Ford或SPFA这个选择题经常考。并查集也是常客特别是带权并查集。2019年我记得有道题是“判断无向图是否有环”用并查集并查时如果两端点已经连通说明有环。并查集的核心就两个函数find带路径压缩union按秩合并代码不到10行值得背熟。3. 机器学习笔试必刷考点从LR到XGBoost3.1 逻辑回归手推梯度更新过程逻辑回归在笔试中出现频率最高基本是送分题但很多人栽在推导细节上。模型是 P(y1|x)1/(1e^(-θ·x))。损失函数是交叉熵L-sum[y*log(p)(1-y)*log(1-p)]。手推推导时核心步骤是把sigmoid导数的性质用上p p(1-p)。最后得到梯度更新公式θ_j θ_j lr * sum((y_i - p_i) * x_ij) / m这里有一个常被问到的点为什么不用均方误差因为LR用MSE的话损失函数是非凸的而用交叉熵得到的是凸函数梯度下降能收敛到全局最优。这个“为什么”一定要能口头解释。另一个细节LR对特征尺度敏感连续特征最好做标准化否则梯度更新在量纲大的维度上会很慢。3.2 SVM最大间隔、对偶问题与核函数选择SVM在笔试里常考的不只是概念而是线性SVM的优化目标推导。核心思想最大化间隔 2/||w||等价于最小化 ||w||²/2约束条件是 y_i(w·x_ib) ≥ 1。拉格朗日对偶后得到KKT条件支持向量就是那些落在间隔边界上的样本对应alpha0的点。常见选择题问法SVM能处理非线性分类的原因是核函数高斯核对应无限维特征空间的映射容易过拟合核函数必须是半正定的软间隔引入松弛变量是容忍噪声的关键。2019年有一道问答题是为什么SVM对高维稀疏数据效果好回答要点是SVM只依赖支持向量不依赖全部样本且自带正则化泛化能力强。3.3 聚类与KNN算法细节比名字更重要聚类算法在笔试题里多半是概念加计算混合。K-Means常考的细节包括初始化方式随机选K个点但容易陷入局部最优改进版是K-Means距离越远越容易被选为中心、收敛条件中心点不再变化或者变化小于阈值、如何选K肘部法则、轮廓系数、Gap Statistic以及对异常点敏感因为用的是均值而非中位数。KNN也很经典。我记得有一道题问“KNN算法的应用能力包括哪三个方面”我的理解是分类、回归和异常检测。KNN做分类时找K个最近邻投票回归时取均值或加权平均异常检测时看点到邻居的距离距离过大判定为异常。还有一个容易考的细节KNN没有显式训练过程是惰性学习对特征尺度敏感必须标准化否则距离会被大尺度特征主导。3.4 模型评估AUC/ROC、F1与过拟合与欠拟合笔试题里的评估指标题本质上在考察“你凭什么说模型好”。精确率 Precision TP/(TPFP)查准率。召回率 Recall TP/(TPFN)查全率。F1 2PR/(PR)调和平均偏向小值适合类别不平衡场景。ROC曲线横轴FPR纵轴TPRAUC表示随机取正样本得分大于负样本的概率AUC0.5是随机1是完美。一个高频判断题类别极度不平衡时应该看什么答案是AUC或PR曲线。因为准确率会被多数类主导90%的负样本直接全预测为负也有90%准确率但没意义。过拟合的解决手段也要能默写增加数据、正则化、Dropout、早停、交叉验证、数据增强。欠拟合则相反增加模型复杂度、特征工程、减少正则化。3.5 集成学习随机森林、GBDT与XGBoost为什么强集成学习在笔试中的出场率逐年升高到2019年几乎成了必考。随机森林是Bagging的代表核心是样本有放回采样和特征随机采样最终投票或平均。它的两个随机让模型方差降低对异常值稳健。GBDT是Boosting的代表每棵树拟合前一棵树的负梯度残差近似逐步减小偏差。笔试题常问GBDT的弱学习器为什么必须是CART回归树因为要拟合连续的负梯度所以不能是分类树。XGBoost相对GBDT的改进点也常被问目标函数加入了正则项、二阶泰勒展开、列采样、对缺失值的自动处理、支持近似直方图算法。2019年还有公司问“XGBoost如何防止过拟合”能答出shrinkage学习率、子采样、列采样、树深度限制、正则化就已经及格了。4. 深度学习高频题与手推4.1 反向传播拿一个两层网络手算梯度深度学习笔试最常见的就是手推反向传播。题目通常会给定一个两层的全连接网络让你求出某个参数的梯度。我的建议是别死记公式而是牢牢抓住链式法则。假设损失是L参数是W梯度是 dL/dW dL/dy * dy/dz * dz/dW一层层从后往前推。有一个经典细节中间变量要命名清晰比如 z1W1·xb1a1ReLU(z1)z2W2·a1b2a2sigmoid(z2)L交叉熵(a2, y)。写的时候把每个局部梯度都标出来最后乘起来就行。笔试改卷时看的是过程分所以哪怕是选择计算题也要把链式过程写在草稿上答案唯一但步骤要清晰。4.2 CNN与RNN感受野计算和梯度消失的坑CNN的高频题是感受野计算。公式RF_new RF_old (kernel_size - 1) * stride_product其中stride_product是之前所有stride的乘积。还有参数共享和局部连接带来的参数减少量计算。传统的图像处理算子有时候也会拿来当卷积核例子比如Sobel算子做边缘检测本质上就是一个固定权重的卷积核用来计算图像梯度。这类题在笔试里出现不奇怪知道原理就能答。RNN的必考题是梯度消失和爆炸原因。因为时间步反向传播时梯度要乘上循环权重矩阵的连乘如果矩阵的谱半径小于1梯度会指数衰减大于1则指数爆炸。这也解释了为什么LSTM要用门控机制通过遗忘门和记忆单元让梯度有一条相对稳定的通路。4.3 激活函数与优化器选型背后的道理2019年笔试题里激活函数考得很细Sigmoid输出非零均值导致后层输入全为正梯度方向受限而且容易饱和梯度消失Tanh解决了零均值问题但依然饱和ReLU解决了正区间的饱和问题但Dead ReLU问题明显学习率太大会让负区间神经元永久失活Leaky ReLU和PReLU就是针对Dead ReLU的改进。优化器考得最多的是SGD、Momentum、Adam。SGD稳定但收敛慢Momentum引入历史梯度能穿越局部震荡RMSProp按梯度平方自适应调整学习率Adam结合Momentum和RMSProp默认参数β10.9、β20.999、epsilon1e-8。我个人的应试技巧是不需要背所有公式但要能说出Adam的两个一阶矩和二阶矩分别代表什么以及为什么能加速收敛。5. 数学基础、智力题与工程算法思想5.1 概率与期望贝叶斯、随机变量的典型题概率题在算法岗笔试中几乎是固定板块因为机器学习本质是概率建模。2019年我见过的高频题包括先验概率加条件概率求后验贝叶斯公式直接套掷骰子直到出现6的期望次数几何分布的期望是6次抽卡类期望题收集完整套卡所需次数期望等于 n * (1 1/2 ... 1/n)两枚硬币一枚双正面随机取一枚抛一次正面朝上问它是双正面硬币的概率答案是2/3用贝叶斯。遇到概率题要先把事件定义清楚再写公式。笔试题时间紧张时先把分数高的题写完别在一道期望题上死磕。5.2 矩阵运算与极大似然估计矩阵题不算多但极大似然估计是必考。最常见的题型是给一组服从高斯分布的样本求均值和方差的MLE。做法写出对数似然函数对均值求导为0得到均值等于样本均值对方差求导为0注意得到的方差是除以n而不是n-1这是MLE和样本方差的一个差别笔试经常挖这个坑。矩阵部分2019年考过特征值分解和SVD的选择题记住对称矩阵可正交对角化SVD对任意矩阵都适用奇异值从大到小排列前k个奇异值对应的子空间就是最重要的低秩近似。5.3 笔试中突然出现的工程算法思想PID、卡尔曼滤波、粒子群有同学会问工程算法会不会考会。2019年我碰到过一道简答题PID算法在电源控制中的作用。这种题主要考察工程直觉不需要精确定义。PID三个字母分别对应比例、积分、微分比例项及时响应当前误差积分项消除稳态误差微分项抑制超调和振荡。类似地粒子群算法在笔试题中偶尔出现考察点是粒子代表候选解速度和位置更新公式由个体最优和全局最优引导本质是一种基于群体协作的随机优化算法。卡尔曼滤波则是先预测后更新用观测修正状态估计核心思想是状态空间模型加最优估计。这类题不需要深入推导但至少要能说清楚它解决什么问题、核心思想是什么。6. 备赛路线与实战建议6.1 考前两个月怎么分配复习时间2019年我自己的复习节奏供参考第一阶段数据结构加算法题。用在线题库刷到200题左右重点刷数组、字符串、链表、二叉树、动态规划和贪心。第二阶段机器学习加深度学习基础。把逻辑回归、SVM、决策树、聚类、KNN、CNN、RNN的推导过一遍每个模型都能独立推导损失函数和梯度更新。第三阶段真题模拟。卡时间做整套笔试题尤其是编程题部分必须限时训练输入输出。这个安排的核心逻辑是编程题决定能不能进面试机器学习推导决定面试官对你的第一印象。两者都不能拖到临考再突击。6.2 编程题实战技巧输入输出、边界与调试笔试编程题和在线刷题平台一个很大的区别是笔试要自己处理输入输出。很多刷题刷得很好的同学在笔试现场反而因为输入读取不熟而挂掉。我的建议是准备一套自己的模板例如Python用sys.stdin.readline读取C用getline分割字符串。还要特别注意多组测试数据时要用while循环读取有时候输入是逗号分隔的字符串要先split再转类型。边界条件别轻视。二分查找的leftright快排的leftrightDP数组的下标从0开始还是从1开始这些细节在笔试中是高频失分点。6.3 复盘时别只看错题把“会而不对”的题单独记录笔试结束后不要只看哪些题错了更要注意那些“明明会做但没得满分”的题。可能是边界没处理可能是公式写错符号这些“会而不对”的题是提分最快的地方。我准备过一个错题表列三列题目描述、我的错误解法、正确解法和出错原因。考前翻一遍比盲目刷题有用得多。2019年那批笔试题给我留下的一个深刻体会是真正的分水岭不在难题而在基础题能不能做到不丢分。你现在如果正在准备算法岗校招我建议把逻辑回归推导、KMP的next数组、快排边界、反向传播链式法则这些“看起来简单”的内容练到条件反射的程度。我当年笔试里吃过的最大亏恰恰是在自认为熟悉的知识点上犯了低级错误比如KMP的next数组下标从0还是从1开始没看清楚直接整道题白给。希望这篇复盘能让你少踩几个类似的坑。
返回列表