2023年飞猪秋招工程岗笔试,是我整个秋招季里做得最“有意思”的一场在线笔试。说它有意思,不是因为题有多难,而是它把算法、计算机基础和旅行业务场景揉在了一起。如果你正打算投飞猪或者其他阿里系公司的工程岗,又不太清楚这类笔试到底考什么,这篇复盘应该能帮上忙。我会从试卷结构、题型案例、复习策略、考场节奏几个角度,把自己实际踩过的坑和总结的方法全部交代清楚,尽量不让你再走一遍弯路。
先说明一下,我投的是后端工程方向,前端、测试开发、算法方向在题型配比上可能略有差异,但基础知识和编程题部分通常是共通的。整场笔试给我最大的感受是:刷题不够会慌,只会刷题也不够,还得会读业务背景题。下面展开聊。
1. 为什么飞猪工程岗笔试值得单独写一篇复盘
1.1 笔试前我对飞猪的预期
投简历的时候,我对飞猪的认知基本停留在“阿里旗下做旅行预订的平台”这个层面,潜意识里觉得它的笔试可能会比纯互联网公司更偏产品和业务。比如考“如何设计一个促销页面”“如何做酒店排序”这类问题。但实际情况和我想的并不完全一样。
2023年秋招的工程岗笔试,飞猪并没有把业务题当作主体,核心仍然是计算机基础加算法题,只是部分选择题和编程题会套上旅行场景的背景。比如同样是考图论,它会描述成“从A城市到B城市的中转航班最少有几程”;同样是考动态规划,它会包装成“在预算内选酒店组合使总评分最高”。这个设计思路其实很“阿里系”:题目能落地,但底子还是那些经典的数据结构和算法。
所以我给后来人的第一句话就是:不要因为它是旅行平台就疯狂准备业务方案,也不要因为它是阿里系就觉得算法会难到离谱。飞猪的笔试更平衡,真正拉开差距的是你能不能快速从长题干里抽取出数学模型,并且把手里的题稳稳做对。
1.2 笔试整体流程与平台
我当时是在第三方在线笔试平台完成的,开考前有一系列环境检测步骤,包括摄像头、麦克风、屏幕录制权限。这里要特别提醒:如果你用的是公司电脑或者装了奇怪的杀毒软件,一定要提前一天把这些权限都打开,否则开考后手忙脚乱。
正式笔试时间我记得是90分钟,题型分为单选、多选、编程题,另外还有一道简答题。整体题量不算特别大,但节奏一旦乱了就会觉得时间不够。平台支持多种编程语言,Java、C++、Python、Go 这些主流语言都可用,我选了 Java。页面左侧是题目描述,右侧是代码编辑器,支持本地调试但不确定是否有自定义测试用例。我习惯先把样例复制到本地跑一遍,再去提交。
这种流程和很多互联网公司的在线笔试类似,但又有一点不同:飞猪的题目描述通常更长,尤其是编程题,前面会先铺垫一段业务场景,再提出输入输出要求。读题能力不好的同学,很容易把时间浪费在理解题面上。
1.3 和其他公司笔试的差异
我秋招还做过字节、美团、携程、京东的笔试,对比下来飞猪有几个比较明显的特征。
第一,选择题覆盖面比较广,不光是数据结构,还有网络、数据库、操作系统、Linux、Java/C++基础。字节的笔试更偏纯算法,选择题少;美团的笔试和飞猪有点像,也会考一些行测或者逻辑题,但飞猪的技术味更浓。
第二,编程题难度梯度比较明显。第一道通常是热身题,简单到中等;第二道是中等偏上;第三道如果有,往往是需要仔细建模的模拟题或搜索题。这种梯度设置区分度很好,基础扎实的人能提前交卷,基础一般的人会被第二道卡住。
第三,业务场景题不是考你“产品思维”,而是考“工程思维”。它问你“库存超卖怎么办”“排队时间怎么预测”,本质上想看你有没有系统设计的基本功,而不是听你扯一堆运营策略。
正是这些差异,让我觉得有必要把这场笔试单独拿出来复盘。接下来我把题型和具体的答题思路拆开讲。
2. 题型结构拆解:选择题、编程题、场景题分别考什么
2.1 计算机基础选择题的范围
选择题是飞猪笔试里最容易被低估的部分。很多人把精力全压在编程题上,结果选择题失分惨重。从我遇到的题目来看,范围大致覆盖了下面这些内容。
| 科目 | 高频考点举例 | 重要程度 |
|---|---|---|
| 数据结构 | 栈和队列、二叉树遍历、哈希冲突处理、堆排序复杂度 | 高 |
| 操作系统 | 进程与线程、死锁条件、虚拟内存、页面置换算法 | 高 |
| 计算机网络 | TCP三次握手、HTTP状态码、DNS解析过程、HTTPS握手 | 高 |
| 数据库 | 索引失效场景、事务隔离级别、乐观锁与悲观锁、SQL优化 | 中高 |
| 编程语言 | Java内存模型、C++智能指针、Python全局解释器锁 | 中 |
| Linux | 常用命令、文件权限、进程查看、软链与硬链 | 中 |
比如有一道题问“TCP建立连接过程中,客户端收到服务端的SYN+ACK后,如果此时客户端状态是SYN_SENT,那么它应该进入哪个状态”,这种题只要背过状态机就能答。还有一道问“MySQL中RR隔离级别下是否有幻读问题”,答案是InnoDB在RR下通过间隙锁解决了大部分幻读,但要注意区分快照读和当前读。这些都是经典中的经典,却特别能检验基础扎不扎实。
多选比单选更需要谨慎。我遇到的多选主要集中在网络协议和数据库索引上,少选可能得部分分,错选或多选不得分。所以拿不准的选项宁可空着也不要乱选。这一点很多人不知道,容易在考场上吃亏。
2.2 算法编程题的分值分布与难度
编程题的分值一般占大头,通常在40到60分之间。题量通常两到三道,我那次遇到的是三道。第一道是链表题,难度大概在LeetCode简单到中等之间,主要考察指针操作;第二道是动态规划,考的是背包问题的变形;第三道是比较复杂的模拟题,背景和航线中转有关。
从分值分配来看,第一道题虽然简单,但分值不低,必须有十足把握一次通过。第二道题是区分度题,很多人能想到动态规划,但状态定义不准确,或者初始化不对,导致连样例都过不了。第三道题我反而建议最后做,因为它的读题成本高、编码量大,性价比不一定高。
我当时的策略是:先快速浏览三道编程题,判断难度,然后直接从第一道开始。第一道大概用了15分钟做完并测试通过;第二道花了30分钟,中间还因为数组越界改了一次;第三道只剩10分钟,只写了一个暴力搜索的部分逻辑,最后没有通过所有测试用例。这个结果让我意识到,考试时“放弃难题、保稳简单题”绝对是最优解。
2.3 旅行业务场景题的隐藏考点
除了编程题,笔试里还会出现简答题或场景设计题。这类题不是让你写代码,而是让你用文字描述方案。我记得当时遇到的一道题是“如何设计一个热门景点的排队时间预测系统”,后来听其他同学说,也有人遇到“酒店库存超卖怎么处理”“如何给用户推荐低价机票”。
这类题目的隐藏考点有三个。
第一个是框架感。你不需要写出完整的系统设计文档,但至少要给出数据采集、数据存储、预测模型、对外接口、异常兜底这五个层次。每个层次哪怕只写一两句话,也能显得思路完整。
第二个是业务理解。比如做排队时间预测,需要考虑淡旺季、天气、节假日、实时人流量这些因素。如果能把这些变量点出来,说明你真的理解旅行场景,而不是只会背八股。
第三个是落地意识。方案里必须有缓存、降级、监控之类的关键词。比如预测服务依赖第三方数据接口,接口挂了怎么办?你需要给出降级方案,比如返回历史平均值。这比吹一堆高大上的算法更让面试官信服。
我把这类题当作“小型系统设计”来准备,答题时先画核心流程,再补充关键细节。虽然笔试里没有交互画图,但也可以在文本框里用箭头符号画出流程,阅卷时很加分。
3. 几个我印象最深的题目类型和答题思路
3.1 链表和二叉树:常规题怎么拿满分
第一道链表题让我印象很深,因为它太经典了,经典到很多人反而会大意。题目要求删除链表中重复出现的节点,注意不是“删除重复值只保留一个”,而是“只要有重复就全部删除”。比如链表 1 -> 2 -> 3 -> 3 -> 4 -> 4 -> 5,处理完应该变成 1 -> 2 -> 5。
这种题很容易在指针操作上出问题。我当时写了两种思路:第一种是递归,第二种是迭代。迭代写法需要设置一个 dummy 头节点,然后用 prev 指向当前确定不重复的节点,cur 向后遍历。核心判断是 cur.val 是否等于 cur.next.val,如果相等就一直向后走,最后让 prev.next 指向第一个不重复的节点。
写代码的时候必须注意空指针。尤其是 cur.next 可能为 null 的情况,一定要先判空再访问。我的习惯是先把链表的边界条件写在纸上:空链表、只有一个节点、全部节点重复、重复节点在头部或尾部、重复节点在中间。把这些边界一个一个在本地跑过,再提交,基本就能一次过。
二叉树题也是同理。飞猪笔试里考到了二叉树的层序遍历,看起来简单,但要求返回“每一层最右边的节点”,其实就是二叉树的右视图。用 BFS 的话很简单,只要在每一层遍历结束后取最后一个节点。但如果你忽略叶子节点为空的情况,或者没有用队列长度来控制层边界,就容易出错。
这类常规题拿满分的诀窍其实只有一句话:平时练习时不要只满足于“过样例”,要主动想边界条件。我见过太多人 LeetCode 刷了几百题,一到笔试看到熟悉题反而写错,就是因为平时全靠“背答案”,没有真正理解指针和递归的每一步变化。
3.2 动态规划与状态压缩:一道酒店价格组合题
第二道编程题是“预算内选择酒店组合,使总评分最高”,本质上是一个典型的0-1背包问题:每个酒店有价格和评分,预算相当于背包容量,要在不超过预算的情况下让评分总和最大。如果只是这样,难度并不高,但它增加了一个限制:酒店数量很多,预算金额也很大,直接用二维数组存 dp[i][j] 会内存溢出。
我当时用了一维滚动数组优化。状态转移方程是:dp[j] = max(dp[j], dp[j - price[i]] + score[i])。这里要注意,滚动数组必须从后往前遍历,否则同一个酒店会被重复选择,就成了完全背包。这种细节是笔试的高频失分点。
下面是一段简化的 Java 代码骨架,展示了滚动数组的核心逻辑:
int[] dp = new int[budget + 1]; Arrays.fill(dp, 0); for (int i = 0; i < n; i++) { for (int j = budget; j >= price[i]; j--) { dp[j] = Math.max(dp[j], dp[j - price[i]] + score[i]); } } return dp[budget];很多人会问,为什么内层循环要从后往前?我的理解是:0-1背包要求每件物品最多选一次,从后往前更新时,dp[j - price[i]] 还是上一轮的状态,没有包含当前酒店;如果从前往后更新,dp[j - price[i]] 已经被当前酒店更新过,就会产生“重复选同一件物品”的效果。这个解释我在面试时也用过,面试官比较认可。
除了背包,飞猪这类公司还喜欢考最短路和拓扑排序。比如“城市航线最少中转次数”就是 BFS,不是 Dijkstra,因为无权图求最短路径直接用 BFS 就够了。如果题干里出现了“每段航程耗时相同”这种条件,优先考虑 BFS。不要一看到图就上 Dijkstra,反而把简单题做复杂。
3.3 在线笔试的输入输出陷阱
在线笔试和本地刷题最大的区别就是输入输出。飞猪笔试用的是牛客网那套风格,输入格式需要自己处理。以下是我踩过的坑。
第一个坑:题目说“第一行一个整数T,表示测试数据组数”,但很多人只处理了一组数据,没有用 while (T-- > 0) 包起来。只要输入样例里不出现多组数据,本地怎么跑都能过;但线上测试用例只要有多组数据,直接就错。我当时写完链表题后专门检查了这一段,才避免翻车。
第二个坑:输入中含有字符串而不是纯数字。比如城市名“Beijing”“Shanghai”,很多人习惯用 char 数组存储,结果比较时因为长度不对而出错。其实直接用 String 就好,Java 比较字符串要用 equals,不要用 ==。
第三个坑:输出格式要求精确。有的题要求每个结果占一行,有的要求用空格分隔,末尾不能有额外空格。如果题目说“每个结果后面跟一个空格”也必须认真读。我见过有朋友因为多打了一个空格被判格式错误,虽然分值不多,但很影响心态。
处理输入输出时,我的一般步骤是:先看输入描述,确定第一行是什么、后面几行是什么;然后写一个本地测试文件,把样例复制进去;跑通后,再故意制造一个边界输入,比如空数组、最大值,看看程序会不会崩溃。这套流程很笨,但确实能避免大量非算法错误。
3.4 简答题:系统设计面试的小型版
简答题是我最开始最害怕的部分,因为大学里很少教系统设计。但经过几次笔试后我总结出一套答题框架,飞猪的场景题也能套用。
框架分四步:先说目标,再说流程,再说存储,最后说异常处理。
以“热门景点排队时间预测系统”为例,我的回答结构是这样的:
- 目标:根据历史数据和实时人流,预测未来15分钟到2小时的排队时长,减少游客等待焦虑。
- 数据采集:从门票系统、景区闸机、App定位获取实时客流,再接入天气和节假日数据。
- 预测方式:短期用时间序列或回归模型,长期用历史同期的分位数曲线进行修正。
- 存储与接口:原始数据进时序数据库,预测结果放 Redis 缓存,接口设置 1 分钟有效期。
- 异常处理:第三方数据源故障时降级为历史均值,系统压力大时直接返回上一次的缓存结果,同时记录监控指标。
这套回答不一定是最优解,但至少完整地展示了工程思维。笔试阅卷时间很紧张,如果你的答案逻辑清晰、关键词到位,很容易拿高分。反之,只写“用机器学习预测”这种空洞话,基本不得分。
4. 备战这类笔试的时间安排与刷题策略
4.1 知识清单:从数据结构到计算机网络
如果你距离笔试还有一个月,我建议把时间分成三块:数据结构与算法占五成,计算机基础占三成,业务场景和行测占两成。很多人只刷题,不复习基础,结果选择题靠猜,最后总分被拉低;也有很多人只背书,不刷题,笔试看到编程题毫无手感。两者都不可取。
数据结构方面,数组、链表、栈、队列、哈希表、二叉树、堆、图是重点。不需要死磕红黑树和 B+ 树的实现细节,但要能说出它们的应用场景和基本性质。算法方面,排序、二分查找、双指针、DFS/BFS、动态规划、贪心是重点。其中贪心和动态规划要重点区分,很多场景题会包装成“最优解”,但其实贪心不够,必须动态规划。
计算机网络方面,重点看 TCP/UDP、HTTP/HTTPS、DNS、Socket。数据库方面,重点看索引、事务、锁、SQL优化。操作系统方面,重点看进程线程、死锁、内存管理。Java 方向的同学还要把 JVM 内存区域、垃圾回收、类加载机制过一遍;C++ 方向的同学重点看智能指针、内存泄漏、虚函数。这些知识点不需要背到一字不差,但要能应付选择题里的概念辨析。
4.2 刷题节奏和重点题型
我自己的刷题节奏是“专题+模拟”两阶段。第一阶段是前两周,按专题刷 LeetCode,每天保证两道新题和一道复习。每个专题至少刷15道,尤其是链表、二叉树、动态规划、图论这四个专题。第二阶段是后两周,每天做一场模拟笔试,优先选择阿里系或者牛客网上的在线编程题,目的是适应平台操作和输入输出风格。
模拟笔试时一定要严格计时。我见过很多人刷题很厉害,但一到笔试就手忙脚乱,因为平时没有模拟过时间压力。我会设置 90 分钟倒计时,到点必须停,然后复盘每道题的完成情况和失误点。几次模拟下来,你会发现自己的时间分配问题,然后主动调整。
还有一个针对飞猪这类公司的技巧:多练长题干模拟题。可以去牛客网搜“阿里笔试”“携程笔试”“京东笔试”这些关键词,找那些题干长、背景杂的题目来做。重点是练读题速度和信息提取能力。我一开始读一道长题干要花10分钟,练了一周后能压到5分钟。笔试时这道题节省下来的时间,可以留给编程题检查。
4.3 阿里系笔试的特征与针对性准备
阿里系笔试的编程题有一个共同特征:对代码规范和边界要求很高,有时候甚至会因为变量名不够清晰被扣分?虽然提交系统不会因为风格扣分,但面试官看代码时会有印象分。所以平时刷题就要养成好习惯:变量名要有语义,注释写得简洁,不要写一长串没有任何空格的代码。
另一个特征是题目里的业务描述通常很长,但大部分是干扰信息。比如一道关于“旅行套餐推荐”的题,可能真正需要的只是“给一个数组、一个目标值,找出符合条件的组合数量”,和旅行没有任何关系。你要学会把背景剥离掉,直接看输入输出定义。
我备考时还特别注意了“数据范围”。因为数据范围直接决定算法复杂度。比如 n <= 10^5,那 O(n^2) 大概率超时,必须想 O(n log n) 或 O(n);如果 n <= 20,多半是状态压缩或者暴力搜索。飞猪的题一般会在输入描述里明确写出范围,读题时用笔圈出来,选算法就有方向了。
5. 真实考试中的时间分配与实战经验
5.1 我的时间分配方案
如果你也是90分钟笔试,我推荐这样分配:前10分钟快速浏览全部题目,把选择题里没把握的标记出来;然后花50分钟做编程题,先做最有把握的那道;再用20分钟回头检查选择题和简答题,最后留10分钟检查输入输出和提交。这套方案不是固定的,但核心原则是先保编程题,再抢选择题。
我自己第一次模拟笔试时,顺序反了,先做选择题,结果在几道多选上纠结太久,编程题只剩25分钟,第一道简单题都没写完。后来我调整策略,一上来先看编程题,心里有底后再做选择题,如果选择题遇到犹豫不决的直接标记,绝不停留超过两分钟。这个调整让我的笔试成绩提升了至少10分。
还有一点:不要因为前面选择题做得顺手,就忘了编程题的存在。飞猪笔试的题目顺序通常是选择题、编程题、简答题,但你可以自由切换。我建议把电脑屏幕分两块,一块放答题页面,一块放本地IDE,这样写编程题时能快速测试。很多在线平台本身就支持切到自测用例,但可能有延迟,不如本地 IDE 顺手。
5.2 现场容易忽略的硬件和网络准备
在线笔试最怕的不是题难,而是环境出问题。我当时就栽在了一个乌龙上:开考前忘记关闭 Windows 的系统更新弹窗。结果正写第二道动态规划时,屏幕右下角弹出一个硕大的“重启以完成更新”提示,虽然没强制重启,但我的状态和思路全被打断了。
所以考试前请务必做好这几件事:
- 关闭所有即时通讯软件,包括手机上的,尽量用电脑静音。
- 关掉浏览器插件,尤其是广告拦截、翻译插件,有些平台会因为这些插件导致页面异常。
- 关闭系统自动更新,Windows 可以在服务里暂停更新一周,macOS 也可以关闭 App Store 自动更新。
- 确保网络稳定。建议使用有线网络,同时打开手机热点作为备用。笔试时一旦断网,重新登录可能要花好几分钟,非常亏。
- 准备一个带摄像头和麦克风的电脑。现在很多笔试都要求摄像头监控,如果没有摄像头,可能连考试都进不去。
我后来还听说有同学因为浏览器版本太旧,导致代码编辑器无法正常显示。建议提前一天登录笔试平台,进入模拟环境测试一下,不要等到开考前一小时才想起这回事。
5.3 笔试结束后的复盘方法
笔试结束不是终点,而是新的起点。我每次笔试结束后都会做两件事:第一,趁记忆新鲜,把题目大概内容记录在备忘录里;第二,当天晚上重新把编程题做一遍,尤其是没做出来的那道。
拿飞猪这场来说,我第二道酒店组合题当时用滚动数组跑过了样例,但不确定是否全对。晚上复现时,我发现自己的 dp 数组初始化长度是 budget + 1,但酒店价格为 0 时会出现死循环。虽然题目里价格应该是正整数,但万一有边界测试,可能就会挂。这个发现让我出了一身冷汗。
我把这个错误记进了错题本,还加上一句提醒:“遇到背包问题,先确认 weight 是否可能为 0;如果为 0,需要单独处理,否则内层循环会死循环。”这种具体的复盘,比单纯刷题有用得多。
如果你也能把每次笔试的失误点积累下来,下一场笔试前翻一下,能避免很多重复错误。尤其是一些“粗心型”问题,比如没有 T 组数据循环、数组越界、忘记 long 类型等,这些都是可以在复盘中提前规避的。
最后再分享一个小技巧:飞猪这类旅行背景的笔试,对“读题速度”的要求比一般公司高。我建议备考时多拿长题干模拟题训练,先在草稿纸上写出数据流,再动手敲代码。如果遇到完全没思路的题,也先把暴力解法写上去,能过一部分测试用例是一部分。笔试评分不是非黑即白,暴力解也能拿到分段分数。希望这些经验能帮你在下一场笔试里少踩几个坑,多拿几分。