☰
蚂蚁工程研发岗秋招笔试复盘:题型解析与避坑指南
2026/10/11 13:45:28 网站建设 项目流程

每年七八月开始,秋招笔试就像一场全国巡回的闯关游戏。2024年这一轮我投的是蚂蚁集团工程研发岗,投递后大约一周收到了笔试通知,被安排在9月中旬第2批。工程研发岗和纯后端研发不太一样,它更像一个“全栈底座”的角色:既要写业务代码,也要碰基础组件、稳定性、性能优化,所以笔试考察范围非常宽。这篇不是标准答案,也不是试卷复原,而是把我在第2批笔试中的真实体验、题目类型、答题策略和踩坑点全部整理出来。如果你也准备投大厂工程研发岗,或者是被“工程研发”这四个字搞得拿不准考察偏向的人,这篇应该能帮你少走一点弯路。

1. 考前准备与整体观察

1.1 笔试通知与环境搭建

蚂蚁的笔试通知通常提前两三天通过邮件和短信同步发送,邮件里会写明考试平台、时间、场次,以及一个非常重要的东西:考试须知。第2批笔试用的还是牛客网系统,这在国内大厂里很常见,但不同于部分公司可以自由使用本地IDE,蚂蚁这边明确要求使用网页编辑器,并且全程开启摄像头监控,部分场次还会有第二机位的要求。所以考前那几天我做的第一件事,不是刷题,而是把设备环境彻底测一遍。

这里有个细节容易被忽略:牛客网考试页面对浏览器的兼容性比较挑剔,Chrome和Edge是推荐选项,但自动更新后的版本有时候会触发组件未加载的提示。我提前一天用通知链接里的“模拟笔试”功能跑了流程,确认摄像头能打开、麦克风能录音、屏幕共享权限正常。千万别小看这一步,在群里已经看到有人因为摄像头权限没开,进入答题页后系统一直报“环境异常”,最后被迫退出重进,白白浪费了5分钟。

第二机位的话,准备一台手机或者平板放在侧后方,角度最好能拍到桌面和双手。我用的是手机支架放到侧后方45度,调试了两次才保证画面里既能看到屏幕,也能看到手部动作。有的同学习惯把第二机位放在正后方,但那样拍不到双手,如果监考严格一点可能被判异常,所以侧后方是最稳妥的角度。

1.2 工程研发岗的考察范围拆解

第2批笔试整体时长是120分钟,题量比想象中大:20道单选题、5道多选题、2道编程题,外加一小段开放性的简答题。单选和多选覆盖了操作系统、计算机网络、数据库、Java基础、并发编程、Spring框架,还有一些算法与数据结构的基础概念。多选占比不算低,而且蚂蚁的少选会给部分分数,多选则直接不得分,所以答题策略上要谨慎,不确定的宁可少选。

工程研发岗和纯算法岗最大的区别在于:算法题难度天花板没那么高,但选择题的广度要求明显更高。像TCP拥塞控制的状态变化、JVM垃圾回收器之间的区别、MySQL索引失效场景、Redis持久化策略,这些属于高频考点,基本属于送分题。真正拉分的是那些偏“工程落地”的题目,比如线上CPU飙升怎么排查、分布式锁怎么设计、某段SQL为什么慢,这类题没有标准教材可以直接背,需要对业务和技术栈有真实理解。

编程题两道,分值各占25分和30分,剩下的是选择题和简答题。第一道题偏简单,第二道题稍难。整体时间分配上,我的建议是:选择题控制在45分钟内,编程题留至少60分钟,简答题控制在15分钟以内。编程题至少要保证第一题稳拿全部分数,第二题能拿部分分数就绝不空着。

1.3 答题顺序与心理预期

我采用的顺序是:先做编程题,再做选择题,最后做简答题。原因是编程题在高度紧张的状态下越往后越容易慌,趁刚开考脑子清醒先解决大头。不少人的习惯是从头做到尾,结果选择题磨了太长时间,编程题只剩二十分钟,这是最亏的。笔试不像面试,代码题是客观分,选择题有些还能靠直觉蒙一个,但代码题空着就是零分。

另一个心态上的预期:不要指望所有题目都会。蚂蚁的笔试题目每年都有一定比例的新题,可能网上完全搜不到,遇到陌生考点很正常。把会做的做对,把不会的排除掉错误选项,拿到60%到70%的分数已经能进入下一轮。我做完多选题其实心里很没底,后来复盘发现大部分不确定的题目都避开了那些过于绝对的选项,最终笔试还是顺利通过了。

2. 算法题专项复盘

2.1 题一:贪心与排序的组合题

第一道编程题描述得很长,但去掉场景包装,核心就是给定若干任务和截止时间,要求安排顺序使得整体收益最大化。这类题的典型解法是贪心加排序,本质很像“会议室调度”或“任务调度”的变体。我当时先按截止时间升序排序,再用优先队列维护已选任务,每当当前时间超过某个任务的截止时间时,就弹出收益最小的任务并累加差值——这是处理带截止时间收益最大化问题的标准套路。

写代码时要注意一个细节:题目的数据范围可能达到10的5次方,所以时间复杂度必须控制在O(n log n)。如果你用暴力法两重循环,大概率会有用例超时。我提交第一版时担心边界,把任务数做了个特判,其实完全没必要,因为题面保证输入合法。但有一个值得注意的点:任务收益可能有负数,处理时要判断清楚“是否应该跳过负数收益的任务”,还是“只要任务能完成就一定要选”。这个直接决定答案框架。

这里分享一个我实际踩过的坑:优先队列里存放的收益值,Java默认是小顶堆,但如果你存入的是负数,弹出的是“最小”实际是“负得最多”的那个。当时我想当然以为是弹出最小的正数,结果第一个样例就错了,吓得赶紧回头检查。所以用PriorityQueue时默认行为要想清楚,不然贪心很容易变成“反贪”。

2.2 题二:带状态压缩的动态规划

第二题是一道基于矩阵的路径统计题——在网格中从左上角走到右下角,中间有若干不能经过的障碍点,且要求恰好经过某些指定点,问有多少种合法路径。由于指定点数量很少,大概不超过10个,状态压缩就成了关键。思路是把这些“必须经过的点”以及起点终点单独建图,预处理它们两两之间的最短路径数,再通过状态压缩DP计算经过所有指定点的方案数。

这题如果只有障碍物没有指定点,就是普通二维DP;但加上“必须经过”后,必须考虑不同经过顺序,所以需要把顺序压缩成状态。当时我先把所有特殊点拿出来编号,然后用BFS/DP求两两之间的路径数,最后用dp[mask][i]表示已经访问过的点集合是mask,当前在点i的方案数。这个思路看起来顺,但实现时有一个大坑:两点之间路径数可能会非常大,题目要求对1e9+7取模,这还好说;更麻烦的是,如果两个特殊点之间不存在任何合法路径,直接置为0,但状态转移时不能把它们当作正常值处理,否则会污染后面的状态。

我还犯了一个细节错误:Java里数组初始化默认是0,我直接用0表示“不可达”,但有些状态本身方案数就是0,导致分不清是没算还是不可达。后来改成用-1初始化,这才把逻辑理顺。写状态压缩DP时,一定要区分开“状态未被计算”和“状态结果就是0”,不然debug会疯掉。

2.3 算法题的调试与环境适应

牛客网这套在线编辑器没有断点调试,全靠print和肉眼查错,所以建议平时就要养成“小规模验证”的习惯。我这次写完第一题先本地测试了题目给的示例,又自造了一个边界用例——所有任务都是负数收益,验证了程序不会把负数任务强行加入。第二题则重点验证了所有特殊点不可达的情况,发现输出应该是0而不是其他错误值。

在线编译器还有一点和IDE不同:报错信息给的比较模糊,尤其StackOverflowError往往只提示一行,看不清是哪里递归爆栈。所以编程时尽量不写深递归,如果必须用DFS,要把递归深度控制好,或者改成显式栈。我这道题两次点之间求路径数用的就是迭代DP,而不是DFS,避免因递归层数太深导致栈溢出。

答完编程题后不要急着做选择题,回头检查一下变量命名有没有可能导致编译错误,Java的public类名必须和文件名一致,如果编辑器默认文件名为Main,类名写错了直接编译失败。这种低级错误每年都有不少人踩,一定要留心。

3. 计算机基础选择题复盘

3.1 操作系统与网络高频考点

单选和多选里,操作系统约占了4到5道。考得比较基础但容易混淆:进程和线程的转换、死锁的必要条件、虚拟内存页面置换算法、常见调度算法。印象比较深的是有一道关于LRU和LFU区别的多选题,考的是“在哪些场景下LRU命中率会低于LFU”。这种题如果只看概念背答案,很容易选错,必须理解实现原理。LRU基于“最近访问时间”,LFU基于“访问频率”,如果一批数据被周期性地快速访问,但每次访问间隔超过LRU窗口,LRU会频繁淘汰它们,而LFU能把它们保留下来。所以场景题一定要动手模拟一遍。

网络部分考了TCP三次握手和四次挥手、拥塞控制慢启动门限变化、HTTP状态码语义,以及DNS解析流程。其中有一道关于HTTP 301和302区别的单选题——301是永久重定向,302是临时重定向,这个很简单。但另一道关于HTTP/2多路复用和队头阻塞的题目比较有迷惑性:HTTP/2解决了应用层队头阻塞,但TCP层仍有队头阻塞,所以它不能完全消除所有阻塞。选项里有“彻底解决了队头阻塞”的说法,显然是错的。

我自己的复盘心得是:操作系统和网络这类基础科目,不要只看面经,最好把《深入理解计算机系统》里关于虚拟内存和进程调度的章节、以及TCP/IP协议栈的关键状态机过一遍。蚂蚁的题目虽然是选择题,但选项往往做过模糊化处理,只靠背口诀很容易翻车。

3.2 数据库与Java基础题目

数据库这块考了索引失效、事务隔离级别、MVCC原理、B+树与B树的区别。有一道题目给出两条SQL,问为什么第一条能用上索引,第二条却不行,本质是考察“在索引列上使用函数会导致索引失效”的规则。这类题在蚂蚁和阿里系笔试中出现的频率极高,建议准备时把所有常见的索引失效场景整理成清单:隐式类型转换、左模糊查询、联合索引未满足最左前缀、在索引列上进行计算或函数操作、OR连接的非索引列条件等。

Java基础方面,第2批笔试对集合类、JVM内存结构、垃圾回收器、线程池参数、Synchronized和ReentrantLock的区别都考到了。有一道多选题问“哪些操作可能导致Full GC次数增加”,选项包括:MetaSpace空间不足、大对象直接进入老年代、System.gc()被调用、Eden区频繁触发Minor GC。最后一个选项其实是干扰项,Minor GC频繁并不会直接导致Full GC,除非晋升阈值调整或老年代空间不足。这种题就是考你是不是真的理解GC触发链条,而不是只背概念。

线程池那块也考得很细:核心线程数、最大线程数、队列长度之间的关系,以及AbortPolicy和CallerRunsPolicy的区别。我建议复习的时候直接把ThreadPoolExecutor的execute流程画一遍,从提交任务到核心线程、工作队列、最大线程、拒绝策略这四步,每一步对应什么场景必须一清二楚。这种工程性强的知识点,笔试容易考,面试也容易考,值得花时间彻底吃透。

3.3 选择题的时间控制与蒙题策略

20道单选加5道多选,我给自己设定的时间是45分钟。实际做下来,前10道比较顺利,后面开始遇到不确定的题目,尤其是一些多选题,可能要纠结几分钟。这时候千万不要恋战,可以先标记出来,等做完编程题再回头改。牛客网的选择题支持标记,但页面切换比较隐蔽,我第一次用了两分钟才找到标记按钮在哪里,所以在模拟考试时就应该熟悉界面布局。

对于多选,一个比较稳妥的策略是:拿不准的选项不要选。蚂蚁的多选给的是少选得部分分、多选不得分,因此冒险选一个只有60%把握的选项,期望并不高。与其赌一个多选的分,不如把单选和代码题的分拿稳。我这次五道多选题,至少有四道只选了两个非常确定的选项,虽然可能少了一些分,但保证了有分数入账。

再说一个蒙题技巧:如果某个选项里出现了“一定”“绝对”“所有”这类词,在工程类选择题里通常都是错的;反之,出现“可能”“通常”“不一定”的选项,往往更可靠。这不是绝对真理,但用来做最后抉择时的参考还挺有效。

4. 笔试题型中的细节与突发情况

4.1 牛客网输入输出与本地调试的兼容问题

很多人忽略的细节:牛客网编程题的输入输出格式和使用力扣刷题完全不是一个思路。力扣只需要实现核心函数,牛客网要求自己写Main函数、自己处理输入解析,而且输入可能有多个用例,需要用循环读取。我这次第一道题给的输入格式是多行,每行多个整数,我当时第一版代码用了Scanner逐行读,结果在第一个测试用例中通过了,但第二个用例一直在等待输入,因为没有判断是否还有剩余数据。后来改成while(scanner.hasNext())才解决问题。

另外,在线编辑器对Java的版本可能有影响。我用的是Java 8的语法特性,比如Stream和LocalDate,如果编程环境默认Java 11以上,问题不大;但如果为了保险,尽量使用最基本的集合和数组操作,避免依赖某些只在特定版本才有的API。牛客网一般会标明语言版本,考前一定要看一下。

还有个小建议:输入解析如果很复杂,可以多写几行备注,方便自己理清数据格式。代码不需要提交给面试官看标不美观?实际上他们主要看AC与否,但逻辑清晰总归是好事。系统不会因为你的代码丑扣分,但如果你自己看得晕,就容易改错。

4.2 监控规则与异常处理

蚂蚁笔试对切屏的检测比较严格。浏览器一旦切出考试页面,系统会记录异常行为,切屏次数过多会被判作弊。第2批笔试时我突然被一条系统弹窗打扰,本意是点掉它,但鼠标不小心移出页面边界,结果系统弹了一次警告。我当时心都凉了半截,还好只是警告,不是直接交卷。

这里给大家一个很实用的建议:考前把所有可能弹通知的程序全部退出,包括微信、钉钉、飞书、邮件客户端、浏览器插件消息通知,甚至输入法的弹窗有时候也会触发异常。如果用的是Windows系统,最好把系统通知关掉,尤其是那些偶尔出现的更新提示。有些人为了防弹窗会把浏览器窗口设成全屏,但如果你用的是双显示器,一定要把另一个显示器关掉或者拔掉,因为系统可能检测到多个屏幕会认为你在查找资料。

第二机位的稳定性也要注意。有些同学的手机在考试过程中因为屏幕锁屏或者自动息屏,导致监考画面中断。我的做法是把手机的自动锁屏时间设为“永不”,并且接上电源保持充电状态,这样画面可以一直录到考试结束。还有一点:手机和电脑要在同一个局域网里吗?其实不一定,只要两边的网络都稳定就可以,但强烈建议在家里用有线网络,避免Wi-Fi波动。

4.3 考场上的心态崩盘与自救

我当时做到选择题还剩最后三道时,突然发现自己只剩35分钟写第二道编程题了,一瞬间脑子有点空。好在我提前定了规矩:每道选择题最多思考90秒,一旦超过就随便选一个先跳过去。结果跳过的题有2道,最后根本没时间回来改,但这没有影响整体结果。考场上最怕的不是不会做,而是因为一道题卡住,导致后面所有题都仓促应付。

如果编程题暂时没有思路,有一个自救方法:先写一个暴力解,能过部分用例就拿部分分,再去优化。尤其第二题这种状态压缩DP,如果初始没想清楚,完全可以先写朴素DFS,把经过特殊点顺序的全排列枚举一遍,虽然复杂度很高,但小规模数据可以通过。牛客网的判分是按用例部分给分的,能拿到10分也算不错。最忌讳的是觉得自己不会就空着,空着一定零分。

还有一个小技巧:如果写完代码后编译失败,不要慌着删代码。先检查是不是缺了import,比如使用Arrays.sort需要一个包,但Java的java.util.*默认不包含,一定要写全。很多时候编译失败就是这个问题,补上import就过了。

5. 考后复盘与后续流程

5.1 回忆题目的方法

第2批笔试结束后,我第一时间把自己能记住的考点记在备忘录里,尤其是那些不确定的题目。这个习惯帮了大忙。考后第二天,牛客网上就会出现不少网友的讨论帖,有些会给出样例和解题思路。我拿自己的记忆去对照,发现有两道题我当时的答案是错的,于是重新动手推导了一遍,把知识点补上了。秋招笔试不是考完就结束了,而是通过每场考试查漏补缺。

回忆题目有几个角度:记录考点关键词,比如“TCP拥塞控制”“GC Roots可达性分析”“Redis持久化RDB和AOF”;记录大致的场景描述,不需要完整复述题干;记录自己蒙了哪个选项,以及为什么犹豫。这些信息足够支撑后续复盘。

如果条件允许,把编程题的思路和代码在本地重构一遍。我第二道题当时虽然AC了,但事后自己又重写了一个版本,发现一个状态转移的顺序问题——我枚举状态时先枚举了当前点,再枚举下一个点,其实应该反过来,会导致重复计数。这种问题在考场上不一定暴露,但如果在本地多跑几个测试用例就可能翻车。所以笔试通过只代表当时没踩坑,不代表代码质量高,多复盘才能真的成长。

5.2 评估笔试结果与自己竞争力

笔试结束后大概一周左右收到了面试通知。从持续时间来看,第2批笔试到面试时间间隔并不固定,有人早有人晚。那几天很多人会在群里问“有收到面试吗”,本质是焦虑。这时要做的不是反复刷新邮箱,而是准备面试内容。笔试只是一道门槛,真正决定offer的是后续的技术面、项目和综合面。

怎么评估自己是否通过笔试?一个比较粗略的参考:代码题至少AC一道,另一道有部分用例通过;选择题正确率在60%以上,基本能进面试。如果代码题两道都没做出来,但选择题全对,可能也有机会,但不稳。蚂蚁更看重工程能力和编码能力,代码题权重还是比较高的。

我在等待期间做的事:把项目经验整理成讲稿,把自己在实习中遇到的一个线上故障从背景、排查过程、根因到解决方案完整复盘了一遍,还对JVM调优、分布式事务、MySQL优化几个话题做了专项准备。后来面试时发现,工程研发岗面试官确实会追问这些内容,而且问得很细。

5.3 秋招笔试通用经验总结

经历了几家公司的笔试后,我发现大厂工程研发岗笔试的底层出题思路是一样的:基础题考察你知识体系的完整性,算法题考察你代码落地能力,简答题考察你面对复杂系统时的思考框架。换汤不换药,所以无论投哪家公司,一套完整的基础知识体系是通用打底能力。

我的做法是把各家的高频考点汇总到一个文档里,按主题分类,比如“JVM”“并发”“网络”“MySQL”“Redis”“操作系统”“算法模板”。每考完一场,就往对应主题追加新的考点和错题。这样复习到后面,每家的笔试内容都变成了自己知识库的素材,越积累越有底气。而不是背市面上某一份“大厂面经”,因为面经往往是碎片化的,不够系统。

另外,合理利用周一早上刷邮箱的时间。很多公司的面试通知会在周五下午或者周末发出,如果你一直没收到消息,不要慌张。我当时收到蚂蚁面试通知是笔试后第8天,第7天晚上刚好有同学收到,我当晚失眠,第二天一早才看到邮件。其实常规流程就是这样,先发一批,再补发一批,晚几天不等于挂了。

最后再说一个我的个人习惯:每次笔试前的晚上,我不会再刷难题,而是把所有常考的基础知识点快速过一遍,像TCP状态图、线程池参数、索引失效场景。这些短平快的东西能给你很强的安全感,也能在开考后10分钟内帮你迅速进入状态。真正决定笔试上限的是长期积累,但决定状态下限的是考前那几个小时。

如果你正在准备下一场笔试,真心建议把“环境调试”和“时间规划”这两件事提高到和刷题同等重要的位置。设备提前试,流程提前走,顺序提前定。很多时候,一个良好的笔试节奏省下的时间,比硬啃一道偏题要值钱得多。希望这篇记录能给你带来一点参考,也祝大家在秋招这条路上都能拿到自己满意的结果。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询