
2023届秋招大概是近几年最卷的一届算法岗的笔试更是卷王本王。我做过的笔试题里优必选这套算法岗笔试给我留下的印象比较深它不像很多大厂那样把题目集中在LeetCode纯算法上而是明显带着机器人公司的基因机器学习、计算机视觉、控制理论、数据结构全都掺在一起考。这篇文章就完整复盘一下我当时遇到的核心题目、答题思路以及事后总结出的准备方法。顺便说一句优必选当时放出的算法岗方向很杂包括运动控制、视觉感知、导航定位、强化学习等。不同方向的笔试试卷会有差异但公共基础部分基本一致。我这里主要针对视觉感知和通用算法方向的笔试做复盘其他方向可以作为参考。1. 笔试整体布局与考察逻辑1.1 命题方向与岗位匹配优必选做的是人形机器人和服务机器人算法岗位大致分布在几个业务线上机器人导航与定位、视觉感知人脸识别、物体识别、手势识别、运动控制步态规划、平衡控制、强化学习决策策略。这决定了笔试题目不会只是单纯的“五道编程题”而是四类内容都有涉及机器学习/深度学习基础分类模型、损失函数、评估指标、BN/Dropout、优化器、KL散度与变分推断这类题目占了大概30%。数据结构与算法KMP、排序、堆、二分图匹配、动态规划、最短路等占30%左右以选择题和一道手写代码题为主。计算机视觉与图像处理卷积原理、边缘检测算子、图像锐化、目标检测、图像分割、光流等占20%。机器人控制与优化算法PID、卡尔曼滤波、粒子滤波、粒子群优化PSO、模拟退火、路径规划等占20%。从这个分布其实就能看出来投机器人公司的算法岗光刷力扣是不够的还得把图像处理和控制理论的基础捡起来。1.2 时间分配与答题策略我印象里这套题总时长120分钟题量在70道左右其中有五六道是编程题或者说简答推演题。120分钟做70道题平均一道题不到两分钟时间非常紧。我的策略是先扫一遍所有题目把需要动笔计算的题目标出来优先做选择题中不需要复杂计算的概念题快速拿分然后把时间留给拉分的推演题和代码题。这种策略的核心原因在于选择题往往考的是“你知不知道”知道就立刻能选不知道抠十分钟也没用而推导题和代码题是“你会不会”只要思路对多花一点时间就能拿全分。先做概念题可以保证基础分再攻推导题可以拉开差距最忌讳从头到尾按顺序硬磕某一道难题。2. 机器学习与深度学习核心知识点考察2.1 经典送分题KL散度与ELBO推导热搜关键词里有一条“kl elbo 算法原理详解”这确实是优必选笔试的重点。我当时卷子里有一道题给出KL散度的定义要求写出它的非负性证明并且从KL散度出发推导变分自编码器VAE中的ELBOEvidence Lower Bound公式。这道题的完整推导思路是这样的给定真实数据分布 p(x) 和近似后验 q(z|x)我们想最大化对数似然 log p(x)。直接计算 log p(x) 不可行因为需要对隐变量 z 积分所以引入变分分布 q(z|x)然后做分解log p(x) log p(x) * ∫q(z|x)dz ∫q(z|x) log p(x) dz因为 log p(x) 与 z 无关可以在积分号内。接着把 p(x) 写成 p(x, z) / p(z|x)log p(x) ∫q(z|x) log [p(x, z) / p(z|x)] dz ∫q(z|x) log [p(x, z) / q(z|x)] dz ∫q(z|x) log [q(z|x) / p(z|x)] dz后一项就是 KL(q(z|x) || p(z|x))恒大于等于0。前一项就是ELBO。所以 log p(x) ≥ ELBO最大化ELBO就等价于最大化对数似然的下界同时让近似后验 q 逼近真实后验 p。这个推导我一直推荐求职者亲手完整推三遍不是为了背公式而是为了理解变分推断的“近似-优化”思想。优必选做机器人的决策和感知很多模型都需要处理高维连续隐变量VAE、HMM、卡尔曼滤波在底层逻辑上都和这套思路相通。如果只是背结论而不理解推导过程遇到变形题很容易翻车。2.2 深度学习基础模型评估与优化器选择这一板块考得多的还有分类模型的评估指标。印象很深的一道题是在正负样本极不均衡的场景下评估二分类模型应该优先看哪几个指标选项有Accuracy、Precision、Recall、F1-score、AUC、PR曲线。正确答案是F1-score/AUC/PR曲线而不是Accuracy。原因是当负样本占99%时瞎猜全负样本Accuracy都有99%但这个模型没有任何实用价值。AUC和PR曲线对不均衡样本更鲁棒PR曲线在极端不均衡下比ROC更敏感。另外一道题是关于优化器的SGD、Momentum、RMSProp、Adam分别解决什么问题这个考点优必选笔试里出现过核心要点可以整理成这样一张表优化器解决的核心问题典型使用场景SGD基础梯度下降收敛稳定但慢小数据集、需要精细调学习率Momentum抑制震荡加速沿稳定方向下降损失面狭窄的山谷结构RMSProp自适应调节每个参数的学习率处理稀疏特征和非平稳目标AdamMomentumRMSProp结合自适应、带动量默认首选训练CNN/Transformer常用有时候还会追问Adam的两个超参 β1、β2 的推荐值一般是0.9和0.999以及为什么偏置修正重要——因为训练初期动量和二阶矩估计偏差较大不修正会导致初期步长异常。这类题没有捷径就是靠日常积累和对着公式逐个理解。我建议基础薄弱的同学把优化器更新公式全部手推一遍尤其是Adam的更新规则和偏差修正优必选笔试曾经以选择题形式考过“Adam更新时为什么需要bias correction”。2.3 容易忽略的BN与Dropout细节BatchNorm和Dropout是深度学习的常客但优必选的笔试题考察得更细。有一道题是训练时使用了Dropout测试时是否需要关闭如果关闭了权重需不需要缩放这个问题很多人只知道“测试时要关闭Dropout”但容易忽略权重缩放。正确的做法是测试时关闭Dropout激活值乘上 keep_prob或者训练时对保留的神经元输出除以 keep_prob才能保证训练和推理时激活值的期望一致。还有一道关于BatchNorm的选择题在batch size较小比如2或4时BN的效果往往会变差原因是统计量估计不稳定。这就是为什么后来LayerNorm在很多视觉模型里更常用因为它不依赖batch维度。这类题考的不是“会不会用”而是“知不知道原理”。我自己的经验是凡是考到BN和Dropout基本上都在确认你是否有过自己从零搭模型、调参训练的经验。实际训练中踩过坑的人对“测试时要不要关dropout”“BN在推理时用哪个均值和方差”这种问题根本不需要犹豫。3. 数据结构与算法板块一道KMP引发的血案3.1 KMP的next数组计算手算方法要熟热搜词里出现了“在kmp算法中对于模式串p\”abacaba\”其next数组”这个场景非常真实优必选笔试确实出了类似的题只不过模式串好像换成了别的。这类题解题的关键在于明确next数组的定义。不同教材对next数组有两种常见定义一种是 next[i] 表示模式串前 i 个字符组成的子串中最长相同前后缀的长度不包含自身另一种是 next[i] 表示失配后跳转的位置前缀长度1。两种定义会导致数组值差1考试时务必先看题目给的定义。以 pabacaba 为例按最常见的定义最长相等前后缀长度不包含自身i0next[0] -1或0看定义i1a没有真前后缀next[1] 0i2ab前缀a后缀b无相等next[2] 0i3aba前缀a和ab后缀ba和a最长相等前后缀为a长度1next[3] 1i4abac前缀a/ab/aba后缀bac/ac/c无相等next[4] 0i5abaca最长相等前后缀为a长度1next[5] 1i6abacab前缀a/ab/aba/abac后缀bacab/acab/cab/ab最长相等前后缀为ab长度2next[6] 2i7abacaba最长相等前后缀为aba长度3next[7] 3手算的方法很简单对每个位置把前缀和后缀列出来找最长相同项。实际笔试时不用真列出来观察模式串的结构特征abacaba整体是一个回文式的结构所以它的最长前后缀长度就是3aba。KMP的代码常年是笔试高频建议自己多写几遍。核心就是构建next数组时用递归递推当 p[i] p[j] 时 next[i1] j1否则 j next[j] 回退。很多人在这一步写错因为没理解“j回退”的本质利用已经算出的next信息避免重复比较。3.2 排序与堆不只是会写冒泡排序热搜词里“冒泡排序算法c”、“堆排序算法”、“快速幂算法c”都反映了大家刷题时的关注点。优必选的笔试选择题里出现了一道典型的排序算法复杂度对比题考察内容包括排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n²)O(1)稳定快速排序O(nlogn)O(n²)O(logn)不稳定归并排序O(nlogn)O(nlogn)O(n)稳定堆排序O(nlogn)O(nlogn)O(1)不稳定我建议把这张表刻在脑子里特别是“快排最坏O(n²)”和“归并排序空间O(n)”这两个高频陷阱题。优必选笔试的编程题里有一道接近“求数组第K大的元素”的题目本质上考的是TopK问题。常见解法有三种全排序O(nlogn)最简单但是笔试时通常不是最优解。小顶堆维护一个大小为K的小顶堆遍历数组堆顶就是第K大。时间复杂度O(nlogK)。快速选择基于快排的partition思想平均O(n)最坏O(n²)。我当时选的是快速选择因为这道题卡了时间要求。笔试时能稳定写出快选的边界条件很重要left、right指针的移动、等于pivot时怎么处理、递归的终止条件每个细节都值得多检查几遍。3.3 动态规划与图论算法应对机器人路径规划的基础优必选做机器人路径规划是核心能力之一。笔试中的算法题也因此涉及了图论相关内容。有一道选择题给了Dijkstra算法的运行图考每一步最小距离的更新过程这要求考生熟知松弛操作和优先队列的用法。另外还有一个填空题提到匈牙利算法HK算法的增广路径概念这属于二分图最大匹配的内容用于解决任务分配问题优必选笔试出现这类题与机器人多任务分配、多目标跟踪中的数据关联有关。动态规划也是一定会考的。我遇到的是一道“机器人从网格左上角走到右下角有多少条不同路径部分格子有障碍物”的变形题。这类题的核心是状态转移方程dp[i][j] dp[i-1][j] dp[i][j-1]无障碍时有障碍物则dp[i][j] 0。不要小看这道题它同时考察了DP思想、边界条件处理和空间优化是否能把二维dp压缩成一维已经是机器人路径规划里比较经典的DP基础题了。3.4 手撕代码的细节从边界条件到复杂度分析优必选笔试代码题不需要在本地跑是在网页编辑器里直接写所以代码的“可读性”和“边界处理”很重要。没有编译器帮你debug只能靠平时练成肌肉记忆。几个实用的自检清单数组下标是否越界空数组和单元素数组是否Cover。递归是否有退出条件递归深度是否可能爆栈。整数溢出涉及加法乘法时用long long。输入输出格式有些题目要求多组输入注意循环读取。写完代码后一定在脑子里过一遍简单例子而不是直接点提交。这些都是平时刷题就要养成的习惯而不是笔试时才想起来临时检查。说实话在高压笔试环境下一边写一边检查边界比自己推翻重来要高效得多。4. 机器人特色考点从图像处理到控制算法4.1 图像处理基础Sobel、拉普拉斯与图像锐化优必选做视觉感知图像处理基础是必考板块。热搜词里“图像锐化的拉普拉斯算法”、“sobel算法”、“图像算法”都出现了确实是核心考点。Sobel算子用于边缘检测本质是一个离散微分算子包含水平方向 Gx 和垂直方向 Gy 两个卷积核Gx [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]Gy [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]梯度幅值 G sqrt(Gx² Gy²)梯度方向 θ atan2(Gy, Gx)。拉普拉斯算子是二阶导数算子对噪声敏感所以经常先高斯模糊再使用这就是LoGLaplacian of Gaussian的做法。图像锐化用拉普拉斯算子的公式是output original - c * Laplace(original)或加取决于算子的符号约定这样能增强边缘对比度让图像看起来更清晰。这类题在笔试中一般考概念和简单应用比如让你判断某个算子是什么作用去噪、锐化、边缘提取或者给出一个3x3卷积核判断它的类型。知道算子的设计初衷和适用的场景答起来就没问题。4.2 视觉感知目标检测与工业异常检测优必选的服务机器人需要识别人脸、手势、物体笔试里出现目标检测基础和工业异常检测的题也很正常。目标检测这块的高频考点包括IOU的计算、NMS非极大值抑制的步骤、Anchor的作用、FCN/Faster R-CNN/YOLO系列的基本思想。有一道计算题是给两个框的坐标算IOU理解交集面积除以并集面积就行注意边界重叠时的坐标计算别少算一个单位。工业异常检测这几年在制造业很热优必选把机器人放进工厂场景做质检也需要这类算法。常见思路包括基于重构误差的如AutoEncoder重建异常区域失败、基于特征嵌入的如PatchCore、基于知识蒸馏的教师-学生网络。如果岗位和工业检测强相关笔试可能会问“异常检测中常用的评估指标”答案是Image-level AUROC和Pixel-level AUROC前者衡量图像是否异常后者衡量异常区域定位的准确性。4.3 控制算法增量式PID与参数作用这一块可能是大部分算法岗同学比较陌生的但对机器人公司来说很自然。优必选笔试里出现了PID算法的题目背景是电机转速控制。PID控制器的连续形式是u(t) Kp * e(t) Ki * ∫e(τ)dτ Kd * de(t)/dt离散化之后位置式PID和增量式PID是两种常见形式。增量式PID的输出是控制量的增量 Δu(k)Δu(k) Kp * [e(k) - e(k-1)] Ki * e(k) Kd * [e(k) - 2e(k-1) e(k-2)]笔试考得最多的三个参数的作用是Kp比例增大响应速度但过大会导致超调甚至震荡。Ki积分消除稳态误差但过大会引起积分饱和和超调。Kd微分抑制超调、改善稳定性但对噪声敏感过大会放大高频噪声。对于优必选的人形机器人步态控制电机控制是底层基础所以笔试考PID一点都不意外。建议有精力的同学再理解一下“增量式PID”为什么比“位置式PID”在工程中更常用优点是输出只跟最近三次误差有关计算量小、故障影响小、手动/自动切换时冲击小。这些点容易被面试官追问笔试即使不考面试也大概率会考。4.4 粒子滤波、PSO与模拟退火优化算法在机器人里的落脚点热搜词里出现了“粒子群算法原理”、“模拟退火算法”、“卡尔曼滤波算法”、“mppt算法”等这说明大家关注优化算法在具体场景中的应用。优必选笔试也考察了粒子群优化PSO和模拟退火SA的基本原理并且结合了机器人路径规划的题目。粒子群优化的核心是每个粒子的速度和位置更新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中“全局最优”和“个体最优”分别对粒子速度产生什么影响。答案是全局最优引导所有粒子向全局历史最优位置靠拢个体最优保留粒子自身的搜索经验两者共同维持了探索与开发的平衡。模拟退火的核心是Metropolis准则当前解 x_old 和新解 x_new如果 ΔE f(x_new) - f(x_old) 0则接受新解否则以概率 exp(-ΔE / T) 接受。温度T随迭代逐渐降低一开始接受差解的概率大有利于跳出局部最优后期趋于贪心。这个思想在机器人路径规划中用于平滑和优化路径虽然不一定是首选但作为对比算法经常出现在笔试选择题里。卡尔曼滤波几乎是机器人定位的标配笔试至少会考状态预测和更新两个公式预测x_pred A * x_prev B * uP_pred A * P_prev * A^T Q更新K P_pred * H^T * (H * P_pred * H^T R)^(-1)x_new x_pred K * (z - H * x_pred)P_new (I - K * H) * P_pred理解卡尔曼滤波不需要死记公式抓住“预测测量修正”的递归思想即可。笔试选择题常考的是过程噪声Q越大代表对模型的信任度越低测量噪声R越大代表对传感器的信任度越低。如果Q大而R小卡尔曼增益K会变大更信任测量反过来则更信任模型预测。4.5 粒子滤波与蒙特卡洛定位优必选的机器人导航定位笔试还出过一道关于粒子滤波的题背景是机器人蒙特卡洛定位MCL。粒子滤波的核心步骤可以总结为四步初始化在状态空间撒粒子、预测根据运动模型移动粒子、加权根据观测模型重新计算粒子权重、重采样去除低权重粒子复制高权重粒子。这一步在优必选笔试中非常经典几乎每年都会刷掉一批没有系统学过机器人算法的人。5. 常见问题与避坑经验5.1 知识点复习优先级别抱着LeetCode死磕我见过太多准备优必选的同学一门心思刷LeetCode hot100最后笔试发现数据结构题只占三成剩下七成是机器学习、图像、控制理论顿时心态就崩了。所以我第一个建议是看岗位JD研究公司的业务方向再有针对性地分配复习时间。如果是视觉感知岗图像处理、CNN、目标检测的优先级高于KMP如果是运动控制岗PID、MPC、动力学基础就是重点如果是导航定位岗卡尔曼滤波、粒子滤波、SLAM、路径规划A*/Dijkstra必须滚瓜烂熟。优必选是一家机器人公司算法岗的“算法”两个字不只是“算法题”的算法更包括了“机器人算法”的算法。投递前务必了解清楚。5.2 编程题的语言选择与输入输出优必选的在线笔试系统支持C、Java、Python等主流语言。我的建议是选你最熟的那门不要临时换语言炫技。这里有一个细节如果选了Python注意输入输出效率。笔试遇到大数据量读取时用 sys.stdin.readline() 和 sys.stdout.write() 比 input() 和 print() 快很多。如果是C注意cin/cout的同步关闭ios::sync_with_stdio(false); cin.tie(nullptr);否则大数据量时可能超时。代码题里还容易出现“答案正确但输出格式不对”的坑比如要求输出精确到小数点后6位你输出到4位判题就报错。建议写完代码后仔细看一遍输出格式要求尤其是浮点数的精度和空格换行。5.3 时间分配不会的先跳过别钻牛角尖120分钟70道题平均一题不到两分钟。我当时的原则是选择题会做的直接选不确定的标记后跳过最后有时间再回来纠结。简答推导题留出整块时间因为它们值得拿分。代码题先想清楚思路再动手不要边写边想否则很容易写一半发现方向错了。压轴难题如果超过10分钟还是没有头绪果断放弃。优必选笔试的通过率不算高但一般也不是要求你考满分而是看总分和几个关键板块的得分。与其在一道题上死磕导致后面全崩不如战略性放弃个别难题保住基础分。5.4 复盘后我重新补强的算法清单考完这次笔试我复盘发现自己有几个薄弱点逐一列出来也给正在准备的同学一个参考变分推断和KL散度推导从“只会用”到“会手推”这一步很重要。推荐把VAE的ELBO推导完整写三遍。KMP的next数组构建不能只会背模板要理解失配跳转的本质。PID的离散化只是背公式不行得理解位置式和增量式在工程应用中的差异。粒子滤波和卡尔曼滤波的应用场景对比两者分别适用什么状态估计问题笔试经常混着考。图像算子的矩阵形式Sobel、Laplacian、高斯核的尺寸和值要能默写。这几块补完之后我心里踏实了不少。因为这些不只是优必选的考点在整个机器人算法岗的秋招里它们都是最高频的知识模块。6. 写在最后的几点体会参加优必选秋招算法岗笔试让我对“算法岗”三个字有了更立体的认识。以前准备大厂算法岗脑子里全是滑窗、双指针、动规但机器人公司的算法岗笔试提醒了我算法工程师是为实际产品服务的你的算法最终要跑到机器人身上让它走路稳、看得见、认得出。所以数据结构与算法是基本功机器学习是进阶技能而图像处理和机器人控制理论则是行业特色的分水岭。如果明年还有学弟学妹投优必选我的建议很简单官网JD多读两遍根据业务线把复习重点倾斜过去常见算法题的复杂度表烂熟于心KL散度、PID、卡尔曼滤波、Sobel算子这些经典内容必须能默写推导。把这几样吃透笔试通过概率会大很多。最后再分享一个小技巧笔试结束后不管自我感觉好不好都第一时间把记得的题目整理成文档写下你的解题思路和不确定的选项。这份复盘记录对后续其他公司的笔试非常有用——很多考点在不同公司之间会反复出现你整理过一遍下次遇到就是送分题。至少对我个人来说优必选这套笔试题的复盘帮我拿下了后面好几家的算法岗笔试。