2017年秋天的携程校招笔试,很多人是捏着汗做完的。印象最深的是题目量大、覆盖广,客观题部分几乎把大学四年能考的知识点都塞进了一张卷子里。作为当年杀过独木桥的过来人,我一直想把这套客观题好好复盘一遍——它不只是"你能做对几道题"的测验,更像一张浓缩的能力体检表,测的是数据结构、数据库、网络、语言基础、逻辑思维,甚至还有对旅游电商业务的理解。这篇文章就是围绕当年开发工程师岗位的客观题方向做的系统汇总,把我记忆里的考点、题型和出题思路拆开讲清楚。无论你正在准备携程的笔试,还是想通过一套经典题目检验自己的计算机基础,这篇内容都值得花二十分钟认真看。
1. 一场90分钟的笔试,携程到底在筛什么
1.1 笔试在整条校招链路里的位置
先放下具体题目,想明白笔试这关为什么存在。校招流程通常是:网申投递、在线笔试、技术面试、HR面。笔试是网申之后的第一道硬过滤,它的目标不是招到"完美候选人",而是用最低成本滤掉基础不过关的人。所以客观题普遍有两个特点:题量大、时间紧。携程的这套题也不例外,90分钟左右的客观题,动辄四五十道,平均每题只有一两分钟。
这个时间设计本身就传递了一个信号:大部分题不是让你现场深思熟虑的,而是考你在压力下的本能反应。一道排序算法的时间复杂度、一段SQL语句的结果、一个HTTP状态码的含义,这些内容如果基础扎实,看到题就能出答案;如果含糊,给十分钟也未必能推对。所以备战笔试,光靠临时抱佛脚背答案效果很差,真正要练的是把基础知识点内化成条件反射。
1.2 携程出题风格的三个底色:业务、数据、工程
很多人以为互联网公司校招笔试都差不多,其实细看各有侧重。携程做的是在线旅游,核心场景是机票、酒店、度假产品的搜索、预订、支付、售后。这些业务背后有大量典型技术问题:高并发下的库存扣减、分布式系统的数据一致性、海量日志的分析处理、推荐系统的排序逻辑。因此它的客观题里,业务情境题的比例明显高于纯做工具类产品的公司。
我复盘下来,携程的题目有三个明显底色。第一是业务感强,题目经常把算法题包装成"预订场景"来出,比如高并发下防止机票超卖、多条件筛选酒店排序;第二是数据意识重,SQL、索引、事务这类题目占比不低,毕竟旅游平台每天处理的是千万级订单数据;第三是工程基础扎实,Java集合、并发、JVM、网络协议这些后端基本功反复出现。这三个底色不是巧合,而是对应着开发工程师入职后马上要面临的实际工作——不是写算法题,是写能扛住流量的系统。
1.3 看汇总的正确姿势:题型背后是能力模型
网上流传的"携程2017校招开发工程师客观题汇总",往往是一堆题目和答案的罗列。如果只是对着答案背,收获非常有限。我的建议是反过来看:把每道题还原成它背后的能力模型。
比如一道"以下哪个集合类线程安全"的题,表面考Java集合,实际考的是并发编程意识;一道"TCP三次握手为什么不是两次"的题,表面考网络协议,实际考的是对可靠传输本质的理解;一道"SQL查询要走哪个索引"的题,表面考索引语法,实际考的是对数据存储结构的理解。当你把题目按能力维度重新归类时,才会发现携程在试卷里藏了一套完整的工程能力评估模型:基础扎实度、逻辑严密性、数据分析能力、业务理解力和临场心态。后面所有的复盘,我都会按这个思路来讲。
2. 客观题六大门类全景:知识点覆盖面与分值权重
把当年流传出来的各类汇总放在一起比较,客观题的知识点分布大体稳定。我按出现频率和印象中的分值权重整理成了一张表,大家可以先有个整体概念:
| 考察板块 | 大致权重 | 典型题型 | 准备难度 |
|---|---|---|---|
| 数据结构与算法 | 25%~30% | 时间复杂度、栈队列、二叉树遍历、动态规划 | 高 |
| 数据库 | 15%~20% | SQL语句结果、索引选择、事务隔离级别 | 中 |
| 操作系统与网络 | 15% | 进程线程、内存管理、TCP/IP、HTTP协议 | 中 |
| 编程语言基础 | 15%~20% | Java集合/PHP语法/前端三件套 | 中 |
| 逻辑推理与智力题 | 10%~15% | 排列组合、概率计算、寻找规律 | 中低 |
| 业务情境题 | 10% | 抢票并发、库存扣减、推荐排序 | 中高 |
2.1 数据结构与算法:占分最稳的一块
数据结构与算法是绝对的C位,原因很简单:它是计算机专业能力的通用语言,不管后续做后端、前端还是算法岗,都绕不开。当年题目里出现频率最高的知识点包括:各种排序算法的时间复杂度和稳定性、链表和数组的插入删除对比、栈和队列的应用场景、二叉树的先序中序后序遍历规则、HashMap的实现原理、图的遍历方式、基本的动态规划问题。
值得注意的一个细节是,客观题里的算法题基本不要求写完整代码,而是考"结论"和"边界"。例如给你一段代码,问时间复杂度和空间复杂度分别是多少;给定一个递归函数,判断会栈溢出吗;哈希冲突的几种解决方法里哪种是链表法。这种考法比写代码更考验精确记忆——你不仅要懂大概思路,还要知道每一个结论的边界条件。我在复习时最大的体会是,每个算法不能只看思想,要能随口说出它的最佳、平均、最差时间复杂度,并且知道为什么。
2.2 数据库:从索引到事务都有题
数据库这块的分值在携程笔试里一直不低。作为一个订单交易平台,数据就是生命线,所以题目会直接从实战出发。最常考的几类:索引的基本原理和适用场景、B+Tree和哈希索引的区别、一条SQL的查询执行顺序、事务的ACID特性、四种隔离级别各自解决了什么问题、乐观锁和悲观锁的概念、常见的SQL优化手段。
这里面有个容易忽略但又特别爱考的点:索引失效的条件。比如在索引列上使用函数、隐式类型转换、LIKE模糊匹配前置通配符,这些情况都会导致索引无法使用。2017年那会儿MySQL还是5.6、5.7的时代,不少题目会直接给你一个表结构加一条SQL,问这条SQL是否能用上索引。复习数据库时,我不建议只刷题,最好把InnoDB索引的底层结构过一遍,知道B+Tree长什么样,为什么用B+Tree而不是红黑树或哈希表,很多选择题的答案就自然出来了。
2.3 操作系统与网络:必考但容易被忽略
操作系统和网络在整个笔试里占比不是最高,但属于"不准备肯定吃亏"的板块。原因在于这些知识点在学校课程里学过,但如果不复习,很容易混淆。操作系统常考:进程与线程的区别、进程间通信方式、死锁产生的四个必要条件、虚拟内存的作用、页面置换算法。网络部分常考:TCP与UDP的区别、TCP三次握手与四次挥手、HTTP状态码、HTTPS的加密过程、Cookie与Session的区别。
这里想单独聊聊HTTP状态码。携程的线上系统每天都在和大量前端、客户端交互,开发工程师必须能读懂状态码语义。考题通常不会直接问你"404什么意思",而是给一个互动场景。比如用户访问一个不存在的页面返回什么,服务器出错返回什么,重定向是301还是302,认证失败是401还是403。看似简单,但每年都有不少人挂在302和307的区别上。提前把1xx到5xx每个常见的状态码都理一遍,属于性价比极高的投入。
2.4 语言基础:方向不同,考察深浅不同
携程开发工程师的岗位分为Java方向、C++方向、PHP方向、前端方向等,不同方向的客观题里语言部分差异很大。比如Java方向,考察集合框架、异常处理、多线程、JVM内存模型这些;PHP方向会考察弱类型比较、数组函数、Session机制;前端方向则是HTML、CSS、JavaScript原型链和闭包。
以Java方向举例,当年的高频点包括:ArrayList和LinkedList的区别、HashMap和Hashtable的区别、ConcurrentHashMap的实现机制、synchronized和ReentrantLock的区别、JVM堆和栈的存储内容、垃圾回收的基本算法。这些题其实不太需要死记硬背,理解了底层原理,无论怎么换马甲都能认出来。但反过来,如果只背面试题答案而不看源码,题目稍微变个角度就会露馅。比如HashMap在JDK1.8前后插入元素的逻辑变化,这就是常考而很多人说不清的细节。
2.5 逻辑推理与智力题:拼的是熟练度和心态
逻辑推理和智力题几乎每套题里都有,虽然分值占比不算高,但它的作用往往是拉差距。这类题常见形式是:给出一串数字找规律、几个人排队说真话假话、分油分水问题、概率与期望计算。参加过笔试就会有这种感觉:算法题大家还能蒙一蒙,逻辑题如果思路没打开,几道题卡住就会消耗大量时间。
我的经验是,逻辑题是可以通过短期训练快速提分的。比如找规律题,优先看差、看比、看奇偶位置拆分;真假话问题,先找互为矛盾的两个条件;概率题,先确定事件全集,再用排列组合公式,不要凭感觉写。2017年的题目里有一道"三只骰子掷出特定点数和的概率",看着复杂,拆成经典分布其实两分钟能算完。这类题很考验临场心态,一旦慌了,本来会做的也会写错。
2.6 业务情境题:携程特色,千万别空着
业务情境题是这套卷子里最有辨识度的部分。它往往不会直接问"请你设计一个秒杀系统",而是以客观题的形式问一些具体细节。例如:一个用户同时发起两个订票请求,数据库层面如何防止重复下单?机票搜索页面要按价格排序,但价格经常变动,缓存策略应该怎么设计?用户浏览了酒店详情页,但最终没有下单,推荐系统应该怎么做?
这种题没有标准答案,但考察的是工程思维。携程明显不是在期待你给出最优架构,而是看你能不能把问题拆成"业务流程分几步、每一步有什么数据、数据存在哪里、并发怎么处理"。我记得有一道关于"库存预扣与释放"的题目,选项里涉及数据库事务、Redis分布式锁、消息队列补偿,如果对业务没有基本概念,很容易选得云里雾里。应对这类题,最好的方法是提前了解电商系统的常见方案,比如库存超卖的防止、下单流程的状态机、缓存与数据库的一致性。
3. 从审题到落笔:高频题型的推演过程与失分点
3.1 一道字符串处理题:复杂度不是唯一的评分标准
先看一类典型的算法选择题:给一段字符串处理的代码,问时间复杂度。很多人一看是双重循环就写O(n^2),但如果外层循环是每次n减半,内层循环做字符串拼接呢?这里最容易踩的坑是忽略了字符串拼接本身的开销。
举个例子,伪代码如下:
String s = ""; for (int i = 0; i < n; i *= 2) { for (int j = 0; j < i; j++) { s += "a"; } }第一眼看上去,外层循环次数是log n,内层循环总次数是1+2+4+...+n约等于2n,所以时间复杂度是O(n)。但如果把s += "a"的底层实现考虑进来,Java的String是不可变对象,每次拼接都会创建新字符串并复制之前的内容,那真实的时间复杂度就变成O(n^2)。这就是典型的"看起来会做,实际处处是坑"的题。当年很多人在这种题上失分,不是因为不懂时间复杂度,而是没有建立起语言底层实现的意识。做这类题,我建议先确认数据结构、再确认循环次数、最后确认每一步操作的开销,三步都走完再写答案。
3.2 一条SQL查询:先写条件还是先选表
数据库题里最常见的套路是给你一张表和一条SQL,然后问你返回什么结果,或者查询计划会怎么走。比如:
SELECT department_id, COUNT(*) FROM employees WHERE salary > 5000 GROUP BY department_id HAVING COUNT(*) > 3 ORDER BY department_id;很多同学对SELECT各关键字的执行顺序记忆混乱,考试时会犹豫要不要算HAVING之前的COUNT。正确的执行顺序是:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY。也就是说,WHERE先过滤掉薪资不达标的人,然后按部门分组,再用HAVING过滤组数量大于3的部门,最后排序。如果没搞清楚这个顺序,很容易把COUNT的结果算错。
这类题的失分点还有两个:一是忘记NULL值的处理方式,COUNT(列名)不会计入NULL,COUNT(*)会;二是GROUP BY之后SELECT里能出现的列有限制,除了聚合函数外的列必须出现在GROUP BY中。这些语法细节在写代码时可能不会每次注意,但在笔试题里就是送命题。
3.3 Java内存这道题:背下来和真理解是两回事
JVM内存模型也是携程笔试的常客。经典题目是"以下哪些区域是线程私有的,哪些是共享的"。答案模型是:程序计数器、虚拟机栈、本地方法栈是线程私有;堆、方法区(元空间)是线程共享。
但这道题真正的坑在后面的延伸:比如问"一个局部变量存到哪里""一个静态变量存在哪里""new出来的数组存在哪里"。不少人背了区域名称,但对具体对象存储的理解是模糊的。我的建议是,用一段代码把每个变量对应到内存区域,想一遍:
public class Order { private static int count = 0; // 类变量 -> 方法区/元空间 private int price; // 实例变量 -> 堆 public void calc(int discount) { // 局部变量 -> 虚拟机栈 int result = price * discount; Order o = new Order(); // 引用在栈,对象在堆 } }理解了"栈管运行,堆管存储"这个核心,加上"哪个线程能访问什么由作用域决定"这条逻辑,JVM内存相关的题基本就能推理出来,不需要硬背。我当年踩过的坑是混淆了"对象在堆上分配"和"局部变量在栈上分配"这两件事,实际上局部变量如果指向一个对象,引用在栈、对象依然在堆。这种细节一定要在复习时自己画一遍。
3.4 一道概率题:表格化拆解避免漏情况
逻辑智力题里概率计算是重灾区。看一道常见题:一个袋子里有红球3个蓝球2个,连续取两次且不放回,求两次都是红球的概率。这道题简单,直接用组合数算C(3,2)/C(5,2)=3/10,但如果题目改成"第一次取到红球且第二次取到蓝球"或"至少一次取到红球",很多人就乱了。
我的建议是,遇到条件概率,先把所有可能的分支情况列成表格,把概率相乘后汇总,而不是在脑子里空转。这种结构化拆解法不仅适用于概率题,也适用于真假话推理和排列组合。很多逻辑题失分并不是因为不会算,而是漏了一种条件或者把"或"和"且"搞混。另一个常见问题是计算时忘记"不放回"导致的样本空间变化。笔试题时间紧,越是这种基础题越要冷静,宁可多花30秒把表格列出来,也不要凭直觉选答案。
3.5 抢票系统超卖问题:事务与锁的经典组合
业务情境题里最有代表性的应该是超卖问题。题目会这样出:某航班只剩最后1张票,两个用户同时下单,系统判断余票大于0后执行扣减,结果两人都下单成功,问该方案的问题是什么,如何解决。
这是一个典型的"检查-再更新"竞态条件问题。正确答案通常涉及:对库存行加锁(SELECT ... FOR UPDATE)、使用乐观锁(版本号或CAS)、或者把扣减操作写成原子SQL更新,例如UPDATE stock SET count = count - 1 WHERE flight_id = ? AND count > 0。不正确的方案包括:不加任何锁、只在应用层用synchronized(多实例部署时不生效)、先查后改而不加限制条件。
这道题之所以高频,是因为它正好把数据库事务、并发控制、业务理解三个维度串在了一起。做这种题时,先判断业务的关键资源是什么,再说并发时会发生什么异常,最后给出对应的技术手段。这个思考路径,也是面试官在后续技术面里想看到的。
4. 2017年的题,放到AI应用开发工程师流行的今天还够用吗
4.1 基础为王:那批题目里的常青树
时间过去这么多年,再看2017年的客观题,有一个直观感受:大部分基础考点没有过时。数据结构与算法、操作系统、网络、数据库这些计算机核心知识,依然是今天所有开发岗位的底座。不管是做传统Web开发,还是转向AI应用开发工程师,你依然需要知道HashMap的底层结构、TCP的三次握手、SQL的索引机制。
为什么这些基础不会过时?因为技术框架每年都在变,但底层的计算机原理几十年没有根本性变化。2017年的笔试题考二叉树遍历,现在的笔试题也考;2017年考HTTP与HTTPS,现在的新题只不过是把HTTP/2、HTTP/3加进来。所以,如果现在还有人拿着2017年的携程客观题来复习,我不会觉得可笑,反而会觉得这人抓住了校招笔试的本质:考察的是恒定的基础能力,而不是浮在表面上的最新框架。
4.2 题型演化的三个方向:场景复杂化、工程化、AI化
当然,如果完全照搬2017年的题来准备现在的笔试,肯定不够。从我看到的近年题目趋势,客观题有三个明显演化方向。
第一个是业务场景变得更复杂。2017年问的是"库存超卖怎么做",现在可能把上下文拉长到"用户在下单前有10秒犹豫期,过期释放库存,同时又发生了支付回调,请判断状态流转是否合理"。考点还是并发和状态机,但信息量更大,也更贴近真实系统的复杂度。
第二个是工程化内容占比上升。分布式缓存、消息队列、微服务治理这些词开始出现在客观题里,虽然不一定考得很深,但要求候选人知道它们解决什么问题、适用什么场景。这背后是行业对校招生的期望提高了,不再是"会写代码就行",而是"对分布式系统有基本概念"。
第三个是AI化,这直接对应了最近热起来的AI应用开发工程师、大模型全栈工程师这类新兴岗位。现在的笔试会考察机器学习的基本概念、Prompt的关键策略、RAG(检索增强生成)的流程,甚至是大模型API调用的成本估算。2017年大家还在聊大数据和机器学习平台,现在的问题已经从"算法原理"转向"如何利用大模型解决实际业务问题"。这种变化,反映的是整个行业技术栈从"造轮子"走向"调模型、接应用"。
4.3 新岗位出现后,客观题会怎么变
那到底会不会有一天,客观题全变成大模型题?我认为不会。一个很现实的原因是,AI应用开发工程师的核心竞争力依然在于工程能力,而不只是会调用API。你调大模型的时候,依然要处理并发、优化响应时间、设计数据持久化方案、保证系统安全,这些全都是传统计算机基础的延伸。
客观题的变化更可能是一个"叠加"过程:在原有数据结构、数据库、网络基础上,新增AI相关考点。比如给一个业务场景,问你适合用大模型解决还是传统规则引擎;或者给你一段RAG代码,问检索过程中哪一步造成了高延迟。这类题不会淘汰基础,而是让基础好的同学更容易胜出。框架会变,题型会变,但"能用扎实的计算机功底解决复杂业务问题"这个考察内核,从2017年到今天,一直没变。
5. 针对这套笔试题的备战节奏:三轮复习与临场分配
5.1 三轮复习法:按板块推进还是按难度推进
如果以携程这套客观题为蓝本准备校招,我建议按三轮来推进,而不是拿到题库就开始无脑刷。
第一轮是查漏,时间大概一周。把六个板块的知识点清单拉出来,每个板块用一天做20道自测题,标记出哪些内容是完全不会、哪些是模糊、哪些是已经熟练的。这一轮的目标不是学会,而是建立"知道哪些地方有待补强"的认知地图。
第二轮是攻坚,时间两周到一个月。针对弱项集中复习,每复习完一个知识点就做对应的题目巩固。比如数据结构里二叉树遍历不熟,就先看前中后序的推导规律,再做十道相关题目,直到形成条件反射。这一轮要从"看懂答案"升级到"能自己讲清楚为什么"。
第三轮是模考,时间在笔试前一周。严格按考试时长做整套真题或模拟题,重点测试时间分配和心态。每次模考后做错题复盘,把错误归成三类:知识点不会、审题不清、计算粗心,分别制定对策。我当年第三轮就发现自己的问题在逻辑题上容易卡壳,于是专门给自己定了规则:逻辑题每道最多3分钟,超时先标记跳过,把会做的分数拿到手再说。
5.2 资源选择:题库、书籍、面经怎么搭配
很多同学问刷题资源怎么选,我的经验是"一本书打底、一个题库强化、若干面经补盲区"。
书的话,算法用《剑指Offer》或LeetCode经典题解,数据库用《高性能MySQL》的相关章节,网络用《图解TCP/IP》或《计算机网络》基础篇,Java方向看《Java编程思想》或更轻量的《Java核心技术》。不需要全部啃完,按知识点章节查漏即可。
题库方面,LeetCode的Top100和历年校招真题都可以刷,但要注意:客观题和LeetCode模式题不完全一样,客观题更偏概念和结论,所以也要配套刷牛客网的专项选择判断题。面经的价值在于了解具体公司的出题风格,比如携程喜欢在业务场景里包装技术考点,那你在看面经时就要多关注这种"包装方式",而不是只看答案。
5.3 临场策略:做完试卷还是保住正确率
笔试现场的时间分配,是决定客观题成绩的关键因素之一。我的策略是四象限法:先花5分钟扫一遍全部题目,按"会不会、计算量大小"把题目分成四类。第一类简单会做的,立刻做掉,拿稳基础分;第二类会做但计算量大,标记后稍后做;第三类完全没思路但有猜的可能,最后统一蒙;第四类实在陌生的,直接跳过。
客观题最大的敌人是"纠结"。一道题卡了五分钟,既浪费时间又影响心态。我的底线是:选择题平均每题不超过2分钟,超过就先凭直觉选一个并在草稿纸上标记,等全部做完再回头检查。考试不是每题都要全对,而是要拿到尽可能多的分数。记住一个比例:如果能保证80%的正确率,哪怕有20%空着或猜错,总分依然很好看。
5.4 笔试之外的加分项:内推与复盘
最后说两个容易被忽略但实际拉分很大的事:内推和复盘。内推不是笔试作弊,而是让你在同等条件下更容易被看到。很多公司内推简历可以直接进入笔试甚至面试环节,省去一轮简历筛选。如果有学长学姐在携程工作,一定要提前打招呼,这比在网上盲投海投效率高得多。
复盘更是关键中的关键。笔试不是交完卷就结束了,每次考完趁记忆还清晰,立刻把题目回忆出来,按知识点归类,查一遍正确答案和原理。我当时建了一个在线表格,列了题号、知识点、我的答案、正确答案、错误原因、需要复习的章节这几列,每次笔试后更新一次。坚持到秋招结束,这个表格就成了最宝贵的个人题库。很多面试中遇到的问题,都和笔试复盘时补过的知识点重合。客观题汇总的价值本来就不在于"背会一份题",而在于通过这份题,把整个知识体系重新串联一遍——这件事,到现在都值得做。