公司动态
饿了么工程岗笔试攻略:题型分布、答题策略与备战路线
每年秋招简历筛选过了第一道真正卡人的坎就是笔试。尤其像饿了么这种体量的公司工程岗笔试刷人比例相当高——不是因为你简历不行而是很多人打开笔试链接的那一刻面对几道算法题和一堆选择题节奏完全是乱的结果连平时70%的水平都没发挥出来。我这些年面试过不少候选人也带过很多学弟学妹备战秋招发现大家对“工程岗笔试”这件事的理解普遍有偏差要么把它当成纯刷题竞赛要么以为和学校期末考试差不多。这篇内容我就结合饿了么工程岗笔试的常见模式把题型结构、考察重点、答题策略和备战方法完整拆一遍。内容基于历年秋招的普遍情况和一线经验总结不是泄题也不针对任何具体年份的真题但对你准备这一类大厂工程岗笔试绝对有参考价值。1. 先搞清楚饿厂工程岗笔试到底在筛什么人1.1 工程岗不等于算法岗笔试考察逻辑完全不同很多人一听“笔试”第一反应就是刷LeetCode然后把大量时间砸在困难题上。但在饿了么工程岗的笔试场景里这个思路是有问题的。算法岗考察的是模型理解、数学推导、算法创新工程岗考察的是基本功扎实程度、代码落地能力、工程思维。两者虽然都考算法题但侧重点完全不同。工程岗的算法题更多是考察你能否快速把一道中等难度的题目用正确的数据结构和边界处理写出来而不是看你是否会奇技淫巧。换句话说笔试官想看到的是给你一个业务需求你能不能把它翻译成清晰、可运行、健壮的代码。这是日常开发的核心能力。所以你会发现饿厂笔试里出现频率很高的往往是“双指针、哈希表、区间合并、模拟、简单的动态规划、拓扑排序”这类题目而不是那种需要灵光一现的竞赛题。这也解释了另一个常见现象有些算法能力很强的人工程岗笔试反而发挥不好。原因有两个一是过于追求最优解而忽略了时间和代码稳定性二是对非算法类题目选择、简答、场景题不够重视。你想想笔试中算法题只占一部分分值前面还有计算机基础选择、数据库SQL、场景设计题这些才是将差距真正拉开的地方。1.2 笔试成绩在秋招流程中的真实权重在秋招环节中笔试的作用不是选“最强的人”而是筛掉“不合格的人”。什么是“不合格”不是没做出最难那道题而是基础题大量错误、代码完全跑不通、答题逻辑混乱。所以笔试对大多数人来说目标不是满分而是稳定通过。你要把目标定在前50%甚至前30%而不是试图把每一道题都做出来。具体到饿厂工程岗从往年整体流程看笔试环节通常是在简历初筛之后、面试之前。笔试成绩会直接影响后续流程但不是一票否决。如果你笔试中呈现出“代码能力合格、基础扎实、有工程意识”这样清晰的画像面试官会更愿意给你机会。反过来即使你笔试成绩一般如果有一方面特别突出比如场景题答得很有章法也可能被留意到。2. 算法题考察规律题型分布、难度梯度与AC策略2.1 高频算法题型的出现概率与应对思路结合本地生活服务业务的特点以及工程岗笔试的普遍风格饿厂笔试中的算法题大致呈现以下几个特征。第一题面往往喜欢披一层业务外衣比如订单分配、骑手路径、优惠券计算、商家排序。内核仍然是经典算法但如果你不熟悉这种“场景化包装”容易被绕进去。所以平时刷题时不要只看纯数据结构题目也要习惯从一段冗长的业务描述中提取真正的算法问题。第二高频题型集中在以下几类数组与字符串处理双指针、滑动窗口、前缀和、哈希表。区间问题区间合并、区间交集、区间覆盖这类和“配送范围”“时间窗口”业务天然契合。动态规划背包、最长递增子序列、编辑距离、状态机DP。图论基础拓扑排序依赖关系、最短路骑手路径、并查集连通性。数据结构应用优先队列、单调栈、线段树低频。一个比较稳妥的备战思路是没必要死磕难题但上述几类的模板题必须做到“闭着眼能写”并且能解释每一行代码为什么这么写。比刷题数量更重要的是整理自己的模板库笔试时直接调用。2.2 难度梯度设计与AC的取舍通常一场笔试会有2到4道编程题难度梯度大致是第一题简单约等于LeetCode Easy偏中等第二题中等标准Medium第三题可能偏难或涉及较复杂建模。如果你是目标是通过策略就是第一题必须AC第二题尽量AC第三题保部分分。如果你一上来就做第三题卡了半小时最后发现第一题都没写会非常被动。“保部分分”也是容易被忽略的一项能力。很多在线笔试平台按测试用例计分你写一个暴力解法能过30%的用例都比交空白卷强。我见过很多人在第二题卡住以后心态崩溃直接交卷这是最亏的做法。你应该做的是先写一个最朴素的暴力解保证能过简单用例再做优化。这是笔试里非常重要的一种能力——不是追求完美的能力而是追求“在有限时间内拿到最多分”的能力。另外编程语言的选择也会影响AC效率。如果你用Java第一题可以用Scanner但数据量大时要用BufferedReader如果使用Ccin/cout容易超时的话需要加上关闭同步的语句。这些看似不起眼的细节在笔试中可能就是AC和TLE的区别。// Java 快速读入模板笔试经常用到 BufferedReader reader new BufferedReader(new InputStreamReader(System.in)); String line; while ((line reader.readLine()) ! null) { String[] parts line.trim().split(\\s); // 处理输入 }2.3 边界条件与数据范围笔试中被扣分最多的隐形杀手代码写出来了自测用例也能过一提交却只有一半分大概率是边界条件没处理好。笔试中的边界条件通常包括输入为空、数组长度为1、目标值不在数组中、数值溢出、数据量大到需要O(n)或O(n log n)解法。我强烈建议你养成一个习惯拿到题目先看数据范围。如果n是10^9那基本排除O(n)的解法如果结果可能超过int范围务必用long如果数组长度可以达到10^5就不要在循环里反复用String拼接之类的O(n^2)操作。可以给自己设定一个做每道题的固定检查清单输入为空或最小值时代码是否还能跑是否有多个元素相等的情况结果是否需要用长整型指针移动时是否可能越界如果用例中有重复操作是否有缓存或剪枝机会这套检查清单用熟了以后AC率提升会非常明显。3. 计算机基础与Java技术栈考点选择题和简答题怎么拿分3.1 操作系统、网络、数据库的高频知识点与复习优先级选择题虽然是笔试里“看起来比较简单”的部分但恰恰是很多人翻车的地方。因为算法题就算没全做对代码能力强也能体现出来而选择题如果错太多会直接影响你“基础是否扎实”的评价。在饿厂这类互联网公司工程岗笔试中选择题的考点高度集中在几块领域。操作系统进程与线程的区别、死锁的四大必要条件、进程调度算法、虚拟内存和页面置换、常见的进程通信方式。这里有个高频考点是“并发与并行”的区别以及线程安全在Java中的具体表现——既然你投的是工程岗最好能把操作系统的概念和Java的线程模型对应起来。计算机网络TCP三次握手与四次挥手、TCP和UDP的区别、HTTP状态码、HTTP与HTTPS的握手流程、DNS解析过程、滑动窗口和拥塞控制。结合饿厂业务很可能会考到“大规模请求下服务端如何保持连接”或“HTTP/2的特性”。这块复习时不需要深挖但所有经典问题的成因和流程一定要能说清楚。数据库索引失效场景、事务隔离级别与脏读幻读、MVCC机制、B树索引结构、SQL优化方向。结合本地生活服务的业务还会涉及高并发下的库存扣减、订单状态一致性所以事务和锁的知识点必须重点掌握。3.2 高并发、缓存、消息队列饿厂业务背后的技术栈考点饿厂作为外卖平台核心业务场景就是高并发、大流量、实时性要求高。所以工程岗笔试通过选择题或简答题考察高并发相关知识几乎是必然的。Redis基础缓存穿透、缓存击穿、缓存雪崩的区别和解决方案Redis持久化方式RDB/AOFRedis分布式锁的实现与问题。消息队列在订单创建、异步通知、日志处理等场景下的用武之地如何保证消息不丢失、消息不重复消费、消息顺序性。分布式系统基础CAP理论、BASE理论、幂等性设计、分布式事务的常见方案两阶段提交、TCC、消息最终一致性。这些内容在笔试中往往以“场景题”或“简答题”的方式出现比如“高并发下秒杀场景如何避免超卖”这种题不是背一个答案就能应付面试官想看到的是你是否能理解数据库行锁的粒度、Redis预扣减的设计、消息队列削峰的作用以及最终一致性如何保证。你需要在答案里展现出“我会从多个层面去考虑”的思维。3.3 SQL题不要只会写最简单的那种饿厂工程岗笔试中SQL题几乎是标配。一般形式是给几张表订单表、商家表、用户表、骑手表让你写一个SQL查询。每年的考点高度相似分组统计、多表连接、排名、去重、日期处理。这类题目最关键的是先画出表结构搞清楚几张表之间的关联字段再考虑过滤条件。不要一上来就写SELECT很容易漏条件或写出笛卡尔积。一个常见的高频题是“查询每个商家的月度订单量和销售额”这需要用到GROUP BY和DATE_FORMAT。另一个高频题是“找出下单数排名前10的用户”需要用到窗口函数ROW_NUMBER()或DENSE_RANK()如果你只会LIMIT遇到并列排名的情况就会错。这部分能力是可以针对性练习的。4. 场景题与设计题体现工程思维的分水岭4.1 场景题的真实考察方式从外卖业务出发相比选择题和算法题场景题是最能体现一个人工程素养的部分也是最需要提前练习的部分。这类题通常以简答或论述出现题干会描述一个业务问题要求你给出解决方案或设计思路。它不一定要求你写完整代码但需要你条理清晰地分析问题、拆解模块、明确数据结构和存储选型并指出方案的优缺点。结合饿厂业务常考的场景题方向大概有设计一个外卖订单推送系统。需要考虑用户端和商家端如何实时收到订单状态变化关键点是消息推送通道、推送失败重试、消息幂等。如何解决高峰期的订单积压问题。涉及异步队列削峰、多队列隔离、动态扩容、限流降级。商家修改菜品价格后如何保证用户端看到的数据一致。涉及缓存更新、缓存的过期策略、读写并发。骑手位置的实时上报和轨迹存储。涉及高频写入、时序数据、地理坐标的存储与查询。这种题没有标准答案但有一个标准的分析框架。用这个框架去答至少能保证你的答案是完整而有结构的。4.2 场景题的答题框架从问题分析到方案落地我总结了一个四步分析法笔试时非常管用。第一步明确问题和目标。先告诉面试官你理解了这个系统要解决什么核心问题。比如设计订单推送系统核心目标不是“把消息发出去”而是“在业务高峰期保证消息不丢、不重、及时”。第二步拆解模块。画出或列出这个系统涉及哪些模块用户端、商家端、骑手端、服务端、消息队列、存储层等。模块拆解不需要太细但要体现出你对整体架构的感知。第三步针对核心问题给出方案。不要泛泛而谈要结合具体技术选型。比如用Redis存储在线状态用MQ做消息异步分发用消息表做最终一致性对账用幂等键去重。每提出一个技术点都要说明“解决了什么问题”。第四步说明方案的边界与取舍。比如“这个方案在极端情况下可能会有消息延迟但可以接受因为订单状态有兜底轮询”。能主动说出取舍说明你真的想过这个问题而不是背书。4.3 工程伦理与细节意识容易被忽略的加分项场景题中还有一个容易被忽略的加分项就是你对异常情况的考虑。很多人的方案只写了“正常流程”用户下单、订单入库、推送商家。但一套真正好的方案还需要考虑“异常流程”用户下单成功了但推送失败怎么办商家收到了重复订单怎么办骑手路径计算服务超时了怎么办订单状态回调丢失怎么办如果你能在答案里主动加入这些异常兜底设计比如重试机制、对账任务、幂等表、状态机轮询面试官会明显对你另眼相看。因为这些才是工程实践中真正天天面对的事情也是区分“刷题选手”和“有项目经验的人”的核心标志。5. 笔试平台的隐性规则与答题节奏细节决定成败5.1 在线笔试平台的常见规则切屏、摄像头、代码编辑器在线笔试和平时在本地刷题有很大不同很多人第一次吃亏就吃在平台规则上。最常见的两个问题是切屏和摄像头。现在的笔试系统普遍能检测到你是否切出了页面一旦切屏次数过多轻则警告重则直接判违规。所以我的建议是开考之前把所有可能用到的东西都准备好包括本地IDE、浏览器文档、聊天工具设置成勿扰。笔试过程中不要试图搜索、不要试图切到微信回消息哪怕你没有任何作弊意图系统检测到切屏也会影响记录。另一个隐性规则是笔试平台的自带编辑器通常很“简陋”语法高亮和自动补全功能偏弱。强烈建议你提前在自己的本地IDE里把代码写好再粘贴到答题区域。但这里需要练习一下有很多人本地写得很好一复制到平台就出现缩进混乱、中英文符号错误。考试前可以去牛客或其他平台做几次模拟笔试适应一下在线编辑器的操作手感。还有一点值得注意的是很多平台会在编程题里要求你以某个函数签名或某个类名如public class Main写代码如果不按要求来直接编译不通过。拿到题先看题目的代码模板尽量不要改类名和方法签名。5.2 答题顺序与时间分配先做有把握的再做分值大的时间分配是笔试中最关键的策略之一。我的建议是开考后先用5分钟把整张试卷扫一遍明确三件事一共有几道编程题、几道选择题、几道问答题哪些题目是自己熟悉的有没有特别难的压轴题。扫完以后按“先易后难、先分多后分少”的原则答题顺序不一定和试卷排版一致。有一个实际的安排可以参考如果总分100分选择题30分编程题50分场景题20分。那么建议的时间分配是选择题20到25分钟编程题70到80分钟场景题20到25分钟最后留5到10分钟检查。当然具体还是要结合你个人情况。如果你算法比较强可以把更多时间留给编程题如果你基础比较扎实那选择题可以快速拿下。这里有个反直觉的技巧有些选择题看起来简单其实藏了陷阱。比如问“以下哪个不是HTTP缓存相关的响应头”答案可能是Set-Cookie但如果审题不仔细就会选错。所以扫完试卷后优先做编程题中你觉得最简单的那个建立信心再做选择题节省时间最后攻克难题。5.3 没有思路时的自救方法暴力解、剪枝、降级处理笔试中遇到完全没有思路的题非常正常。很多人在这种时候直接放弃或者大脑一片空白。实际上即使没有最优解你也可以通过暴力解拿到不少分。比如遇到一道动态规划题目如果你推导不出DP方程可以先尝试用递归备忘录很多情况下这种方法能在数据范围较小时通过大部分用例即使不能完全AC也能覆盖部分测试点。如果再不行就写最朴素的枚举或回溯。虽然时间复杂度很高但至少能保证小数据用例是对的。笔试平台是分测试点给分的你不要觉得“暴力解不光彩”在笔试环境下能拿到分就是硬道理。另一个自救技巧是针对特定数据范围优化。有些题目如果告诉你数据是递增有序的那就必须想到二分如果告诉你数据范围很小那状态压缩或暴力枚举都可行如果要求输出方案而不是方案数可能要先回溯搜索。不要试图用一种模式通吃所有题而是根据数据范围合理猜测出题人想考什么算法。6. 备战路线与踩坑记录从集中刷题到笔面试衔接6.1 一个可执行的4到6周备战计划如果你的笔试时间还有4到6周不建议盲目刷题而是分阶段递进。这里给一个经过验证的计划框架。第一阶段第1到第2周专项扫盲。先用LeetCode的标签分类做题按数组、链表、二叉树、哈希表、双指针、动态规划、图这几个大类去刷。每种类型做10到20道题把基础题型的解题套路摸清形成自己的模板。比如链表题要掌握快慢指针、递归反转二叉树要掌握前中后序遍历的递归和迭代写法以及层序遍历。第二阶段第3到第4周模拟笔试。每周至少做2到3套完整模拟题。模拟时一定要严格按照笔试的时间限制并且使用在线平台牛客、LeetCode周赛、Codeforces新手场都可以练习快速进入状态的节奏。模拟完以后重点看两部分一是错题和卡壳的题二是“有时间限制下容易犯的低级错误”。第三阶段第5到第6周查漏补缺与高频题冲刺。回头检查之前刷过的题目针对薄弱环节做强化。同时开始集中复习计算机基础、SQL、场景题。这些不是刷题能替代的一定要专门花时间整理笔记。这期间建议每天刷题的时长控制在3到4小时不要贪多。重点是有效复盘而不是刷题数量。6.2 实战踩坑记录几个真实发生过的高频错误我带过的候选人里笔试翻车的情况五花八门但有几个高频错误特别典型值得特别提醒。第一个坑是审题不清导致花了大量时间写错方向。比如题目要求“求区间内所有数的最大公约数”有人一上来就以为是求区间和写完了才发现不对。所以做题前一定要先花2到3分钟把题目读透把题目中的输入输出样例在脑子里过一遍。第二个坑是本地能过但平台编译失败。常见原因是类名写错、包名问题、或者方法签名不匹配。有些平台要求提交完整代码有些只需要提交函数题提交前记得看清。第三个坑是超时。很多算法在本地小数据测试没问题但平台给的数据量很大结果不是算法错误而是复杂度太高。解决思路是在写题之前就根据数据范围推算复杂度而不是写完以后才去优化。第四个坑是场景题答得太空洞。比如“请设计一个秒杀系统”候选人写了“使用Redis缓存使用MQ削峰使用数据库事务保证一致性”但完全没有细节。这类答案虽然没有错但属于“正确的废话”。你需要把方案落到具体的数据结构、具体的技术组件、具体的异常处理上。6.3 笔试结束后的复盘把笔试价值最大化很多人把笔试当成一次性的“考试”考完就不管了。但从我的经验来看笔试后的复盘才是提升面试能力最快的环节。因为笔试中的题目往往涵盖了公司和岗位比较看重的技术点也是面试时可能追问的方向。笔试结束后建议你做两件事。第一趁记忆还热把每道题回顾一下。不管对错都重写一遍最优解并整理到自己的错题本里。第二把试卷中出现的考点记录下来对照自己的薄弱项看是否需要补充复习。尤其是那些你选错了的选择题一定要弄明白为什么错而不是靠猜或运气。这样即使这一次笔试没过你的技术积累也在切实增加。秋招是一场马拉松一场笔试的得失说明不了什么保持持续输入机会终究会来的。按我自己带新人的经验笔试最重要的不是“题目都会做”而是“会的题都拿到分不会的题尽量多拿分”。把基础打扎实把策略想清楚把常见坑提前避开你就已经跑赢大多数人。