2024年秋招饿了么算法岗第一批笔试我考完之后从考场出来脑子里第一个念头是这套题出得挺有水平算法、机器学习、业务场景全都覆盖到了而且不是那种背一背就能过的套路题。趁着记忆还热乎我把整场笔试的题型、解题思路、踩过的坑和后续的复盘方法完整整理出来。如果你打算投本地生活赛道的算法岗这份记录应该能帮你少走不少弯路。整场笔试分为客观题和编程题两大部分客观题基本覆盖了数据结构、概率统计、机器学习基础和少量深度学习内容编程题则有两道一道纯算法题一道偏业务建模。总时长大概120分钟题量不算大但对准确率要求很高。我身边有几个同学在同一批次参加考完对了一下发现题目基本一致只是选项顺序有调整说明这是统一的题库抽题模式。下面我按模块详细拆解。1. 笔试的整体情况与题目构成1.1 试卷结构与题型分布先说整体架构。饿了么算法岗第一批笔试采用的是牛客网平台进系统之后会先有一个摄像头检测和环境检查环节确认周围没有干扰之后才能进入答题页面。我当时用的是Chrome浏览器考试前最好把无关插件全部禁用尤其是翻译插件和广告拦截插件牛客的监考系统有时候会对这类插件误报导致人脸识别环节卡住。进入正式答题后卷面分成三块单选题大约12到15道每题分值在2到3分之间。考察范围很杂涵盖数据结构、算法复杂度、机器学习基础、概率论、线性代数。比如我记得有一道题直接问“堆排序在最坏情况下的时间复杂度是多少”还有一道问“L1正则化为什么会产生稀疏解”这类题属于送分题但是如果你平时只是调包调参而没有深入理解原理很容易在几个干扰项之间纠结。多选题5道左右每题4到5分。这部分的规则我第一次没注意漏选可以拿部分分错选直接零分。所以遇到不确定的选项宁可少选不要乱选。题目风格比较偏向机器学习基础例如“哪些方法可以缓解过拟合”“哪些激活函数存在梯度消失问题”等。编程题2到3道分值占比最大大约在40到50分之间。第一道通常是比较经典的算法题这次考的是字符串匹配和快速幂结合的内容后面我会详细拆。第二道和第三道更像业务场景题会结合外卖配送、订单分配等真实业务背景要求你设计算法或者直接写代码。1.2 时间分配策略先说我的时间安排整个过程我基本严格按照“先客观题、后编程题”的顺序来做但这里有个细节牛客平台允许在客观题和编程题之间来回切换所以如果你的编程题卡住了可以先跳去做后面的客观题换换脑子再回来。客观题我给自己定的预算是35分钟实际上用了大概30分钟因为有不少题一眼就能看出答案。多选题耗时较多有一道关于“模型评估指标”的题五个选项里涉及AUC、GAUC、F1、召回率、精确率在正负样本极度不平衡场景下的表现我在“GAUC是否适用于排序场景”这个选项上犹豫了好一会儿最后把不确定的那个选项去掉了只选了三个我认为绝对正确的。编程题预留了85分钟这个时间说多不多说少不少。第一道字符串题我花了40分钟左右做得磕磕绊绊第二道业务场景题用了大约30分钟勉强把主流程写出来第三道题我当时看了一眼发现是个带约束的贪心优化问题果断先写了暴力版本拿部分分数没有再死磕最优解。这套策略建议你提前练熟考场上最忌讳的是和一道题死磕到底。1.3 关于评分规则的细节我特意观察了一下平台的提示和交卷后的分数构成虽然最终不会公布每道题的得分明细但从分数反推可以确认编程题是按case通过率给分的不是非对即错。这意味着你哪怕只能过30%的case也能拿到对应的分数千万别一上来就放弃。多选题的给分规则一定要记牢选对一个得一点分选错一个整题归零。我有个同学就是因为在一道多选题上多选了一个选项直接扣了5分最后总分差了一大截。所以客观题部分的核心策略就一句话稳别浪。2. 算法题解题思路复盘2.1 KMP算法的next数组推导这次的编程题第一道考的是字符串匹配。题目背景大概是“外卖订单备注中需要匹配多个敏感关键词请实现一个高效的匹配函数”然后实际要求就是你写出KMP算法的匹配过程并且计算一个指定模式串的next数组。题目里给的模式串是pabacaba要求写出它的next数组。这里有个小坑KMP的next数组定义在不同教材里略有差异。有些地方定义next[i]是“前i个字符组成的子串中最长相等前后缀的长度”有些地方定义为“当第i位失配时模式串应该回退的位置”。如果你没有提前确认题目采用的是哪一种定义写出来的数组可能整体差一位。我在这里用的是国内算法教材最主流的定义next[i]表示p[0...i]这个前缀子串中最长相等前后缀的长度不包含子串本身。逐位推导如下子串最长相等前后缀next值a无长度为1的串没有真前后缀0ab无0abaa1abac无0abacaa1abacabab2abacabaaba3所以最终next数组是[0, 0, 1, 0, 1, 2, 3]。但是如果你采用“失配时回退位置”的定义数组会整体平移一位变成[-1, 0, 0, 1, 0, 1, 2]。这两种写法在考场上都算对关键是你的代码逻辑要和定义保持一致。我当时的做法是先把这两种定义的差别写在草稿纸上心里默念一遍“这不是背答案而是检验我对前缀函数是否真正理解”然后从定义出发手动推到第五位确认无误后再把结果填上去。因为这种题如果你只是背过模板很容易在一些细节上翻车。2.2 快速幂看似简单但暗藏陷阱第一道编程题的第二小问和快速幂有关题目给了一个很大的指数运算场景类似于“计算a的b次方对p取模其中b的最大值达到10的18次方”。如果你直接写一个循环在b较大时肯定超时所以必须要用快速幂。快速幂的核心思想是把指数拆成二进制通过不断对底数平方来减少乘法次数。例如计算3^1313的二进制是1101也就是13 8 4 1所以3^13 3^8 * 3^4 * 3^1。我们只需要从左到右遍历指数b的每一个二进制位同时维护一个base变量每轮对它取平方当当前位为1时把base乘入结果即可。参考实现如下long long fastPow(long long a, long long b, long long mod) { long long res 1; a % mod; while (b 0) { if (b 1) { res res * a % mod; } a a * a % mod; b 1; } return res; }这段代码看起来简单但有几个易错点值得提醒一定要先执行a % mod否则当a本身已经大于等于mod时后续乘法的结果会爆long long。返回值res % mod其实可以不写因为每次乘法后都取了模但如果mod等于1这个函数会返回0这是对的因为任何数对1取模结果都是0。如果b等于0这个函数直接返回1这符合数学定义。我当时在这道题上多留了个心眼手动验证了fastPow(2, 10, 1000)和fastPow(5, 0, 7)两个边界用例确认输出正确后才继续做后面的题目。2.3 从KMP和快速幂延伸出的考点说到这我想多聊两句。为什么饿了么笔试会考KMP和快速幂因为这两个知识点分别对应了本地生活业务中的两类典型问题字符串匹配对应的是搜索词匹配、订单备注解析、日志异常检测快速幂对应的是加密签名计算、大规模数值运算、分布式系统中的一致性哈希场景。算法岗笔试从来不是为了考你背模板而是看你有没有把基础算法迁移到真实场景的能力。在准备这类题目时我建议你把KMP、快速幂、二分查找、堆排序这四类基础算法练到“闭着眼也能写出来”的程度。它们是笔试的高频考点也经常作为业务场景题的底层工具出现。我这次就是因为KMP的next数组推导花了太多时间导致第二道编程题写得很赶后面我详细说时间分配的问题。3. 机器学习与业务场景题拆解3.1 机器学习基础考点从理论到评估指标客观题里机器学习内容占了相当大的比例而且考察方式明显偏向“工程理解”不是单纯背概念。比如有一道题问“在正负样本严重不平衡的情况下以下哪些评估指标更能反映模型性能”选项包括准确率、精确率、召回率、F1-score、AUC。这道题的核心在于准确率在正样本占比很低的场景下会产生误导比如异常订单比例只有1%模型全预测为正常订单准确率也有99%但实际没有任何检测能力。所以应该关注召回率、精确率、F1和AUC其中AUC对类别分布相对不敏感更适合作为排序类模型的评估指标。还有一道题考了L1和L2正则化的区别问哪种正则化更容易产生稀疏解以及原因。答案是L1因为L1的梯度近似为常数在零点附近会产生“硬阈值”效应使得某些特征的权重被压缩到0而L2的梯度是线性的在靠近零点时越来越小因此权重只会被压得很小但不会归零。这类题如果你只是用sklearn调过参数没有仔细想过背后的数学原理答题时容易犹豫。我个人的准备方法是把机器学习最核心的十个概念做成一张速查表包括偏差方差分解、过拟合与欠拟合、正则化、交叉验证、梯度下降收敛性、损失函数设计、类别不平衡、特征工程、模型融合、评估指标选择。每个概念都要求自己能说出“是什么、为什么、怎么用”。3.2 本地生活场景中的算法建模题这次笔试最有意思的是编程题的第二道题目大意是平台有若干骑手和一批待配送订单每个订单有一个预计送达时间窗口和一个收益值每个骑手同一时间只能接一个订单要求你设计算法在约束条件下最大化总收益。这本质上是一个带时间窗的任务分配问题和经典的最大化收益调度问题很相似。我的第一反应是用贪心加优先队列来做先按截止时间排序订单遍历时用小根堆维护已选订单的收益如果当前订单的截止时间允许加入就直接入堆如果不允许就对比当前订单的收益和堆顶的最小收益如果当前更大就替换。这样可以在多项式时间内得到一个近似最优解。这种思路对应的就是调度和路径规划场景里的经典问题。实际业务中饿了么的订单分配系统会比笔试题目复杂得多要考虑骑手当前位置、实时路况、商家出餐时间、顾客所在楼宇的电梯等待时间、恶劣天气等大量动态因素。笔试只考核心模型但背后的思路很重要——先用简化模型理清收益函数和约束条件再逐步增加现实因素。我在答题时把核心逻辑写成代码后还额外加了一段注释说明这个算法的复杂度是O(n log n)以及它为什么比直接遍历全排列更高效。这种“代码之外的解释”虽然不会直接加分但能让阅卷人看出你对问题本质有思考对后续面试也有帮助。3.3 排序算法、搜索算法和推荐场景的关联客观题里还出现了几道与排序算法相关的题目比如问“归并排序是否稳定”“快速排序在有序数组下的时间复杂度”等。这些题单独看起来很简单但你要知道它们和外卖推荐、搜索排序的关联。在搜索排序场景中我们经常会用到BM25算法做召回然后通过粗排、精排、重排三个环节逐步筛选。你说的排序不光是数据结构里的quick sort或者merge sort更多时候是业务层面的learning to rank也就是用机器学习模型对候选集打分排序。笔试中考察排序算法的稳定性和复杂度本质上是考察你对“排序”这个基础操作的敏感度——如果连快排最坏情况退化到O(n^2)都不清楚很难让人相信你能理解精排模型的线上耗时优化。3.4 深度学习与前沿算法的储备深度学习相关的题目也出现了几道比如“为什么Transformer中要使用位置编码”“Batch Normalization在训练和推理时的行为有何不同”。这些题其实不算难但考察得很细尤其考察你是否真正在训练过程中观察过模型行为而不只是调用过model.fit()。如果你有余力建议提前了解一些常见的优化和搜索算法例如模拟退火、粒子群算法、遗传算法的基本原理和适用场景。虽然本次笔试没有直接考大题但在业务场景题中如果题目涉及路径规划、参数寻优、配送策略搜索这些算法的思想可以作为你设计方案的“武器库”。比如骑手路径规划如果约束条件极其复杂导致精确算法无法在短时间内求解模拟退火或粒子群就能够作为近似求解手段这类储备在面试环节特别加分。4. 笔试时间分配与刷题方向建议4.1 编程题的做题顺序与时间控制我做题时给自己定的顺序是先做编程题第一道因为它是纯算法题思路相对明确做完之后心里踏实再做编程题第二道业务场景题因为它需要思考建模过程最后留时间处理客观题中不确定的多选题。但实际执行下来我在第一道字符串题上花了超过40分钟导致第二道题代码写得很匆忙。这里给出我的建议时间分配你可以考前模拟一下题目类型建议时长策略要点单选15分钟拿分题快速扫过不要恋战多选20分钟不确定的选项坚决不选编程题一30分钟先想清楚边界条件再动手编程题二35分钟核心模型先跑通再考虑优化编程题三15分钟能拿部分分就不要空着这个时间表是理想状态实际中很可能某个环节超时。我的建议是编程题一旦卡住15分钟没有任何进展立刻停下来写一个暴力解法先把case跑一遍拿部分分然后去做其他题目。牛客平台是实时保存代码的暴力解法的分数虽然不高但总比空着强。4.2 刷题重点高频题型与优先级如果你现在才开始准备距离笔试只有一两周时间我不建议你漫无目的地刷题。针对本地生活算法岗题目有明确的高频范围我按优先级整理如下第一优先级字符串匹配KMP、字典树、快速幂、二分查找、贪心、动态规划背包、最长上升子序列、二叉树遍历、堆排序与topK问题。第二优先级并查集、最小生成树、最短路Dijkstra、二分图匹配匈牙利或HK算法、滑动窗口、前缀和、单调栈。第三优先级计算几何、后缀数组、网络流、随机化算法低频出现有时间再看。“华为OD机试”这类偏机构化的题库和算法考点清单我建议选择性参考虽然题目风格不完全一致但其中关于常见数据结构和算法考点的归纳整理值得一看。4.3 选择题场景的知识点复习清单选择题备考比编程题要更聚焦我梳理了本次笔试中实际出现和我在其他同学那里确认到的知识点做成一份复习清单数据结构数组、链表、栈、队列、二叉搜索树、红黑树、B树、哈希表的插入查找删除复杂度。算法分析各类排序算法的时间复杂度、空间复杂度、稳定性递归的时间复杂度推导。机器学习偏差方差分解、过拟合与欠拟合、正则化、模型评估指标、特征工程、交叉验证、聚类算法K-Means、DBSCAN、KNN的优缺点、GBDT/XGBoost/LightGBM的区别。深度学习反向传播、梯度消失和爆炸、常见激活函数、CNN参数计算、RNN/LSTM、Transformer结构、Attention机制。概率统计贝叶斯公式、最大似然估计、期望、方差、正态分布、蒙特卡洛思想。如果你能把这份清单里的每个知识点都用自己的话讲清楚再配上一两道练习题客观题部分基本不会拖后腿。5. 避坑指南与复盘方法5.1 这次笔试里我踩过的坑首先要说的就是KMP的next数组定义问题。我前面提到不同教材对next数组的定义不一样我习惯用的是“最长相等前后缀长度”的定义但如果你背的模板是“失配回退位置”的写法两者就会差一位。建议考前专门花十分钟把这两种定义都刷一遍并且用手写推导确认自己的理解和代码逻辑一致。我当时就是在这个点上不确信先在草稿纸上把两种定义都推了一遍浪费了不少时间。第二个坑是多选题的贪分问题。第一道多选题问“哪些方法可以缓解梯度消失”我一眼就看到了“使用ReLU激活函数”和“使用Batch Normalization”这两个正确项但第三个选项“增加网络层数”让我犹豫了。我的直觉告诉我增加层数反而会加剧梯度消失但当时脑袋一热把这个选项也选上了结果整题零分。血泪教训多选题务必以“确定正确”为唯一选入标准任何“可能对可能不对”的选项都不要选。第三个坑是编程题的暴力解法不够“暴力”。第二道业务场景题我一开始想直接写最优解但写着写着发现状态转移太复杂最后花了两三分钟才改成暴力枚举所有排列的方案。如果一开始就写暴力解法这部分分数至少能多拿一半。考场上时间紧张时优先保证“能跑的通”再考虑“跑得快”。5.2 考后必须做的复盘整理笔试结束后的48小时是记忆最清晰的窗口期一定要趁着题目还在脑子里把它们复盘一遍。我的做法是分两步第一步把能回忆起的题目按知识点分类整理成一个文档标注每道题的题型、难度、我的答案、正确思路。这一步重点是还原题目本身不要管分数。第二步针对错题和蒙对的题在题库里找到两到三道同类题目做一遍比如KMP匹配考差了就把“找出字符串中所有匹配位置”这类变体题刷一遍。知识点只有通过变式训练才能真正内化。我当时复盘完发现自己最大的问题不是算法基础差而是客观题中“机器学习工程细节”类题目做得不够稳尤其是特征工程和模型评估部分。于是我在接下来的两周里把GBDT和XGBoost的论文精读了一遍再把LightGBM的直方图算法和互斥特征捆绑的原理整理成笔记。事实证明这些工作对后续面试帮助极大。5.3 从笔试到面试的衔接准备笔试不是终点它往往决定了面试官提问的方向和深度。我当时在面试环节就被问到“你笔试里用了贪心加优先队列解决订单分配问题如果骑手数量变成几千个订单量几万个你的方案还能跑吗真实系统会怎么做”这个问题把我问住了但反而促使我去思考真实场景的复杂度。面试官其实不是要你给出一个完美方案而是想看到你具备把算法问题抽象、建模、落地的能力。笔试中暴露出的薄弱点恰恰是面试准备的切入点。如果你在笔试中遇到某个场景题没有解出来不要把它当作一次失败而是把它当作一个学习线索顺着这个线索去研究公司技术博客、论文和开源工具你的收获往往比刷十道题更大。我个人在实际操作中的体会是这类笔试真正筛选的不是“你背了多少题”而是“你在有限时间内能不能把学过的东西用出来”。KMP、快速幂、贪心调度这些核心算法平时练到形成肌肉记忆考场上才有余地处理各种幺蛾子。如果你这段时间正在准备类似岗位的笔试建议把这份复盘里的知识点清单和避坑策略直接拿去用至少能让你少踩几个我踩过的坑。
