
当年刷过这套题的朋友估计现在很多都已经带团队了。我前阵子整理旧电脑翻到一份2017年携程校招开发工程师的客观题记录仔细看了一遍感慨挺多的。那会儿的笔试题和现在大厂普遍采用的海量题库在线测评不太一样更看重基础功底的扎实程度题型也比较规整数据结构、算法、操作系统、网络、数据库、语言基础再加上一部分行测逻辑题。这篇文章不是单纯把题目贴出来而是结合我当年备考和后来参与校招面试的经验把每类题背后的考察逻辑、容易踩的坑、以及现在的视角回看有哪些知识点依然重要做个完整拆解。无论你是正在准备校招的应届生还是想查漏补缺的初中级开发这份整理应该都能帮上忙。1. 整体考察逻辑与题型结构1.1 为什么校招笔试要考客观题很多人觉得客观题就是八股文背一背就过了。从面试官的角度看恰恰相反。客观题是筛选成本最低、覆盖面最广的考察方式尤其校招阶段候选人没有太多实际项目经验可以聊基础是否扎实、思维是否严谨通过选择题最能快速暴露。2017年携程的这套题整体结构大概是这样的计算机基础知识数据结构、算法占比约30%操作系统计算机网络占比约25%数据库相关知识占比约15%编程语言基础C/Java为主占比约15%逻辑推理与行测题占比约15%这个比例放在现在依然有参考价值。数据结构和算法永远是大头操作系统和网络是区分度最高的部分数据库则直接关系到你能不能干活。至于行测题主要考察阅读理解、图形推理、数字推理这些通用能力说白了大厂要的是智商在线、沟通不费劲的人。1.2 那一年考察风格的特点2017年的题目有一个鲜明特点偏重原理理解而不是偏重API背诵。比如C的虚函数、Java的垃圾回收、TCP三次握手这些都是理解型考点。如果你只是背概念很容易在变形的选择题里翻车。举个例子题目可能不直接问虚函数是什么而是给你一段继承关系的代码问输出结果是什么或者问基类析构函数是否应该声明为virtual。这种题目考察的是你对运行时多态底层的掌握程度而不是记忆能力。还有一个特点是部分题目会考察边界条件的敏感性。比如数组越界、整数溢出、递归的终止条件这些看起来都是小细节但往往就是区分度所在。做过笔试题的人都有体会四个选项看起来好像都对但只有一个能在所有边界case下成立。这种抠细节的能力恰恰是开发工作最需要的素质之一。2. 高频考点逐类拆解与避坑指南2.1 数据结构与算法不是刷题就完事先说占比最大的数据结构与算法。2017年的题量大概在15题左右覆盖了数组、链表、栈、队列、树、图、排序、查找、动态规划这些常规范围。考的最多的集中在三个方向二叉树相关的遍历、深度、节点计算排序算法的稳定性、时间空间复杂度对比经典算法思想的灵活应用递归、分治、贪心、DP二叉树这块有几类题目属于年年必考已知前序和中序遍历求后序遍历完全二叉树的节点个数计算二叉搜索树的插入顺序与最终形态关系这些题目本身不难但很多人会在递归推导上犯错。比如已知前序遍历序列和中序遍历序列重建二叉树当年就有题目给了两个遍历结果让你判断哪棵树是中序遍历的结果。排序算法这块必须掌握的性质包括稳定性冒泡、插入、归并是稳定的选择、快速、堆排序不稳定最坏时间复杂度快排最坏O(n²)但平均O(nlogn)堆排序始终O(nlogn)空间复杂度归并需要O(n)额外空间快排需要O(logn)递归栈堆排序O(1)当时我见过一个很典型的题目问在数据基本有序的情况下哪种排序算法效率最高。答案显然是插入排序因为基本有序时插入排序可以接近O(n)。很多人第一反应是快排这就是没有理解快排在有序数据上反而会退化到O(n²)的典型表现。动态规划这块2017年考察的还比较基础常见的是斐波那契数列变种、背包问题、最长公共子序列。但要注意的是很多人DP题目能做对但复杂度分析搞不清楚。比如斐波那契数列如果直接递归时间复杂度是指数级的O(2^n)而用迭代只需要O(n)。校招笔试特别喜欢在这种地方设陷阱。注意算法题复习不能只刷题不看复杂度。选择题里经常会在你算对了结果之后再考察一次时间和空间复杂度两问都要答对才给分。想在这方面拿高分我的建议是拿《剑指Offer》和LeetCode入门题做扎实不需要贪多但每种经典题型至少能自己写出最优解并且能清楚地分析复杂度来源。特别是递归一定要画递归树搞清楚每一层做了什么、层数有多深。2.2 操作系统进程线程与内存管理是重灾区操作系统在2017年携程的笔试中大概有6-8题覆盖进程与线程区别、死锁条件、进程调度算法、虚拟内存、页面置换算法。这块是很多非科班同学最头疼的因为平时写代码几乎接触不到。进程与线程的区别是必考题但要注意他们怎么变着法子考。直接问区别属于送分题但题目往往这样包装给出一个多线程程序问哪个资源是线程间共享的、哪个是独立的。这里关键是记住同一进程内的线程共享地址空间、全局变量、文件描述符独立的包括栈空间和寄存器状态。当年有一道题就是问多线程环境下下列哪项不是线程私有的选项里混了堆、栈、全局变量、程序计数器正确答案是堆。因为堆是进程内共享的栈和程序计数器才是线程私有的。死锁这块四个必要条件互斥、持有并等待、不可剥夺、循环等待必须背熟而且要知道怎么通过破坏某个条件来预防死锁。银行家算法是考察热点但2017年的题目相对温和一般是给你一个资源分配表问当前是否安全。做这类题关键就是按部就班地从剩余资源出发找到一个能完整执行的进程顺序。不要跳步不要凭感觉判断一步步推。内存管理里虚拟内存和页面置换算法是重点。最常考的是LRU和FIFO。LRU最近最少使用的核心思想是淘汰最久没有被访问的页面FIFO则是最先进入的页面先被淘汰。考题一般给你一个页面访问序列和一个物理块数量让你算缺页次数。这类题目没有捷径老老实实画表推进注意LRU要记录访问顺序而不仅仅是进入顺序。当年这道题我记得很清楚考察Belady异常使用FIFO页面置换算法时分配的物理块增多缺页次数反而增加。这个知识点很多人会忽略因为直觉上块越多应该缺页越少。但FIFO确实存在这种反直觉的现象而LRU不会。这就是理论功底的分水岭。进程调度算法也是高频考点尤其是时间片轮转RR、先来先服务FCFS、短作业优先SJF。要会算平均等待时间和平均周转时间特别是时间片轮转新进程到达时的排队顺序会影响结果画甘特图是最稳妥的做法。2.3 计算机网络TCP/UDP永远的主角网络部分占的比重和操作系统相当考察内容集中在TCP/IP协议栈、TCP三次握手与四次挥手、HTTP协议、IP地址与子网划分这些基础内容。TCP三次握手为什么是三次而不是两次或四次这个网络经典问题经常考。答案是防止失效的连接请求报文段突然又传到服务端从而产生错误连接。两次握手无法避免这种情况因为服务端无法确认客户端的接收能力是否正常。三次握手双方都能确认自己和对方的收发能力都正常。四次挥手则是因为TCP是全双工的两个方向的连接需要分别关闭。HTTP和HTTPS的区别也是高频考点。HTTPS在HTTP和TCP之间增加了一层SSL/TLS加密端口从80变为443。当年有一道题目问HTTPS使用的默认端口和加密方式。基础题但很多人会把443和8080搞混。IP地址与子网划分这块要熟练掌握A/B/C类地址的默认子网掩码子网划分后的可用主机数计算特殊IP地址127.0.0.1回环地址有一个经典陷阱题给定一个C类网络192.168.1.0/24划分为4个子网问每个子网可用的主机IP范围。这里坑点是子网掩码变为255.255.255.192每个子网有62个可用主机而不是64个因为网络地址和广播地址不能分配给主机。很多人一激动直接把256除以4等于64忘了减去网络地址和广播地址。TCP拥塞控制这块慢启动、拥塞避免、快重传、快恢复2017年考的还相对基础一般就问慢启动的初始窗口大小和拥塞窗口的增长方式。慢启动是从小到大指数增长到达阈值后进入线性增长的拥塞避免阶段。理解这个概念的关键是明白它解决的是网络能力未知时如何安全地增加发送速率的问题。提示复习网络部分建议自己抓包看一次TCP三次握手和HTTP请求的完整过程。Wireshark不需要装虚拟机抓本机回环包就行。真正看过一次报文交互比背十遍协议状态机都管用。2.4 数据库索引原理和SQL语法都要拿捏数据库大约有5-6题重点集中在三个方面索引的底层原理与适用场景、SQL语句的执行顺序、事务的ACID特性与隔离级别。索引这块B树和Hash索引的区别属于必考。B树适合范围查询数据存储在叶子节点且用链表相连Hash索引适合等值查询但不支持范围查询。还要知道InnoDB的主键索引是聚簇索引数据行挂在主键索引的叶子节点上而二级索引的叶子节点存的是主键值所以通过二级索引查询需要回表。当年有一道题我印象很深问在MySQL InnoDB引擎下对已有数据的表添加索引以下说法正确的是。答案是添加索引的过程中会锁定表且对大数据量表耗时很长。很多人以为加索引是瞬时操作其实索引本质上是额外的数据结构构建它需要扫描全表数据并排序耗时和数据量成正比而且会在构建期间阻塞写入。SQL方面重点考察的是多表连接、分组聚合、子查询。JOIN的几种类型——INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN——必须搞清楚返回行数的差异。GROUP BY和HAVING的关系要理解WHERE在分组前过滤行HAVING在分组后过滤组这个是经典考点。事务的ACID特性里隔离级别是必考项。四个级别——读未提交、读已提交、可重复读、串行化——要能说清楚每种级别解决了什么问题又引入了什么问题。核心是两个脏读和幻读。读未提交可能出现脏读读已提交解决了脏读但可能出现不可重复读可重复读解决了不可重复读但可能出现幻读InnoDB通过MVCC和间隙锁实际上在可重复读级别就解决了幻读问题串行化彻底解决但性能最低。注意2017年的数据库题偏理论但现在的校招笔试越来越喜欢结合具体场景。比如问某个慢SQL优化方案或者根据执行计划判断索引是否生效。复习时建议把理论结合实际SQL练习至少会用EXPLAIN分析查询计划。2.5 语言基础C与Java的高频陷阱语言基础部分在2017年占比不算低C和Java都有涉及选择题题目设计得特别巧妙专挑那些看着会、做不对的知识点。C这边的高频考点虚函数与多态当年必考指针与引用的区别const的各种用法内存分配栈、堆、全局区、代码区构造函数与析构函数调用顺序虚函数相关的题目通常会给出一个继承体系代码问你某个对象构造和析构时各函数的调用顺序。核心规律是构造时先基类后派生类析构时先派生类后基类。而基类析构函数必须声明为virtual否则通过基类指针删除派生类对象时只会调用基类析构函数导致派生类资源泄漏。指针与引用的区别高频出题方式给一段代码问输出什么或者问哪个操作是非法的。核心区别在于引用必须初始化且不能更改绑定的对象指针可以重新赋值。引用在底层实现上就是一个常量指针但语法上更安全。Java这边的高频考点垃圾回收机制基础概念HashMap与HashTable的区别线程创建方式final、finally、finalize的区别HashMap与HashTable的区别是经典中的经典。HashTable是线程安全的因为方法都加了synchronized但性能差HashMap非线程安全但性能好。HashMap允许null键和null值HashTable不允许。2017年还会考HashMap的初始容量和负载因子默认初始容量16、负载因子0.75。现在的题目还会追加入JDK 1.8之后HashMap底层在链表长度超过8时转为红黑树的细节。实用建议复习语言基础最好的方式不是看语法书而是找一份高质量的面经题背熟再把你最熟悉的语言的标准库源码翻一翻。理解语言设计者的意图比死记语法规则高效得多。2.6 行测逻辑题不要在这里丢冤枉分行测部分大概是5-6题主要是图形推理、数字推理、逻辑判断、资料分析。这部分对科班同学来说可能有点陌生但难度不大只要掌握常见规律就能拿分。图形推理的核心规律无非就这么几种数量规律点、线、面封闭空间、角的数量变化位置规律平移、旋转、翻转样式规律遍历、叠加、去同存异、去异存同属性规律对称性、曲直性、开闭性数字推理常见类型包括等差数列、等比数列、和数列前两项和等于第三项、积数列、递推数列、多级数列、幂次数列。做题时先看相邻项差值是否成规律再看比值最后考虑递推和幂次。逻辑判断这块要掌握基本推理规则充分条件假言命题如果A那么B等价于非B推出非A必要条件假言命题只有A才B等价于B推出A直言命题的对当关系所有、有的、必然、可能当年有一个很经典的推理题给出四个人的预测说只有一个人预测正确问实际结果是哪个。这种题用假设法快速排除即可不要试图直接推导出全部条件关系。提醒行测题实际是性价比最高的部分。复习一下图形推理的基本规律和逻辑推理的简单规则至少能拿回3-4分。很多技术强的同学反而在这部分丢分非常可惜。3. 实战场景还原与题型复盘3.1 一道典型综合题的全过程拆解为了让你更直观地理解这类笔试的考察方式我挑一道当年的经典题完整还原一下解题过程。题目大致是这样的一个系统中有4个进程每个进程的最大资源需求量和当前已分配资源量如下表所示。系统剩余资源量为2。问该状态是否安全如果安全给出一个安全序列。进程最大需求量已分配量P084P162P252P341解题步骤第一步计算每个进程还需要的资源量最大需求量-已分配量P08-44P16-24P25-23P34-13第二步系统剩余资源量为2寻找一个剩余需求量小于等于2的进程。当前所有进程的剩余需求量都大于2所以第一轮没有任何进程可以执行。这里就直接判断为不安全状态了。这是银行家算法的标准用法如果找不到任何一个进程的剩余需求能被当前剩余资源满足那系统就会死锁不存在安全序列。这道题看起来简单但当时的错误率非常高。我复盘了一下犯错的人大概有两种一种是没有算剩余需求量直接拿最大需求量去和剩余资源比较另一种是总想找到一个可以执行的进程没想到所有进程都无法满足也是一种合法结论。3.2 从真题看面试官出题思路把整套题复盘一遍能明显看出面试官的出题逻辑不是考你记得多少而是考你理解多深。这里有三条非常明显的逻辑线。第一通过选项设计制造差不多先生陷阱。几乎每道选择题都至少要有一个选项看起来和正确答案非常接近但差了一个关键细节。比如计算机网络部分TCP和UDP的区别会有一个选项写成TCP是面向连接的UDP是无连接的TCP比UDP更快。前半段是对的后半段就是胡扯。TCP因为要握手、确认、重传实际上比UDP慢很多但如果你对TCP的可靠性机制理解不深很容易被这个选项带偏。第二用综合场景代替单一概念考察。很多题目不是只考一个知识点而是把两个或者三个知识点串起来。比如给你一段Java代码里面涉及继承、多态、异常处理让你判断输出结果。你得同时知道方法重写的规则、异常处理的执行顺序、静态绑定和动态绑定的区别才能答对。这种综合题最能拉开差距。第三关注边界条件和异常情况。很多题目问的是以下哪种写法可能会导致问题或者哪个选项在特定条件下不成立。考察的是你是否考虑到了各种特殊情况比如数组索引越界、整数溢出、null引用等。说到底这些都是在模拟真实开发中会遇到的bug场景考察的是代码敏感度。3.3 时间分配与做题策略复盘客观题的考试时间一般是一个半小时到两个小时题量在40-60题之间平均每题只有两分钟左右。时间分配策略非常关键。我当时采用的时间分配策略是先跳过所有行测题优先做计算机基础题然后做数据库和语言基础题最后如果还有时间再回过来做行测题。这样做的原因是计算机基础题虽然难但分值一般更高而且作为科班学生做起来更快。行测题虽然简单但需要读题和理解比较耗时放在最后做是因为哪怕时间不够损失也相对较小。具体时间分配可以参考数据结构与算法15分钟操作系统和网络15分钟数据库和语言15分钟行测题10分钟剩余时间检查和攻克难题。做题顺序上有一个很实用的技巧先做有把握的题标记不确定的题最后统一检查。有些题你在第一遍做的时候拿不准但做到后面某个题时突然想起来了再回来看就清晰了。不要在一道题上卡超过3分钟浪费时间不说还会严重影响心态。4. 常见失分原因与面试复盘心得4.1 当年大家普遍翻车的五个细节整理这套题的时候我特意把当年错题本上的记录翻出来总结了五个高频失分点每条都是血泪教训。第一个失分点不看题目问的是正确还是不正确。这个听起来很蠢但确实很多人栽在这里。原因是不少选择题的题干会把不正确加粗或者放在句末扫题太快容易忽略。我的建议是拿到题目先看最后一句问的是什么再回头看题干。顺序调整之后正确率显著提升。第二个失分点多选当单选做。携程的这套题里有多选题但数量不多和单选混在一起。有的人习惯性地按单选思路看到一个正确答案就选了忽略了其他正确选项。我的应对办法是看到题目说以下哪些或者正确的有立刻警觉把所有选项逐一判断而不是找到一个对的就收手。第三个失分点基础概念混淆。C的深拷贝和浅拷贝、Java的equals和、TCP和UDP、进程和线程这些概念平时看着都懂但放到选项里就会搞混。我的解决办法是考前把容易混淆的概念对儿整理成表格反复看几遍直到条件反射般能说出区别。第四个失分点计算题不画图不写过程。特别是进程调度、页面置换、IP子网划分这类需要推算的题目很多人心算一算就错。这不是智力问题是习惯问题。规规矩矩在草稿纸上画表格、画时间轴每一步都写清楚正确率会大幅上升。第五个失分点时间分配失衡。有的同学在算法题上死磕一道题花十几分钟后面的网络和数据库题只剩几分钟慌慌张张乱选。正确做法是遇到不会的题先跳过把能拿的分都拿到有时间再回来攻坚。4.2 查漏补缺方向做题之外的拓展准备笔试只是校招流程中的一环过了笔试之后还有面试。客观题里出现过的知识点经常会以面试问答的形式再次出现而且问得更深。如果你只是把选择题背会了面试官追问一层就会露馅。举一个实例笔试里考了TCP三次握手的过程面试时面试官可能会问为什么不是两次如果客户端发送的SYN丢了会怎么样如果服务器发送的SYNACK丢了会怎么样这三个问题需要的就不只是记住三次握手的过程而是要理解为什么需要确认机制、如何处理超时重传、传输层的可靠性到底是怎么保证的。所以在准备笔试的时候建议养成一个习惯每做完一道题把相关的知识点向深处多想一层。问自己三个问题这个知识点为什么这么设计如果不这么做会有什么问题这个知识点在实际开发中体现在哪里带着这三个问题去复习笔试和面试都能兼顾。还有一个值得推荐的做法把经典题目改编成面试官追问版。比如做到TCP握手相关的题就写下所有能想到的追问SYN Flood攻击是怎么回事快速打开TCP Fast Open是什么解决了什么问题TIME_WAIT状态为什么需要等待2MSL时间戳选项有什么作用这些问题写下来能答上的划掉答不上来的去查资料查完再做笔记输出一遍。这个过程比刷十道选择题都管用。4.3 从2017年到现在的考点演变回过头看2017年的这套题再对比现在大厂的校招笔试能明显感受到几个变化趋势。第一个趋势是算法题的比重进一步上升。现在很多大厂的笔试已经没有客观题了直接就是两道到四道编程题难度对标LeetCode中等偏上。2017年还会有大量选择题考察基础概念现在的趋势是用代码题来综合考察。第二个趋势是新增了很多当年的题目里没有的知识点比如分布式系统的基本概念、缓存Redis的使用场景和淘汰策略、消息队列的基本原理、容器和Kubernetes的基础认知、云原生相关的概念。第三个趋势是题目越来越接近真实业务场景。比如不再只是问如何实现一个LRU缓存而是问在某个业务场景下Redis过期策略和数据一致性如何权衡。这种题目没有标准答案考察的是你在具体场景中做技术决策的能力。虽然考点变了但核心能力要求没变基础扎实、思维严谨、善于深入思考。2017年的这套题之所以还有复盘价值正是因为它代表了这个行业对开发工程师基础能力的经典定义。数据结构、操作系统、网络、数据库这些底层知识到现在依然是区分会用框架和理解原理的关键分水岭。我个人在实际操作中的体会是不管技术栈怎么变花时间把基础打牢永远是回报率最高的投资。当年花了很多时间刷题、整理错题、画报文时序图这些积累当时看是为了应付笔试后来做实际项目时才真正感受到价值。遇到线上问题能迅速定位到是操作系统层面的问题、网络层面的问题还是应用层的问题看到一段有性能隐患的代码能本能地联想到底层的数据结构和算法。这种能力不是背面试题能获得的而是靠那些看起来枯燥的基础知识一点点堆出来的。这套2017年的题可以当作一面镜子照一下自己的基础功是否还扎实。如果你在做这些题时感觉吃力别焦虑正好说明还有提升空间笔试不等人但打基础这件事任何时候开始都不晚。