对于不少经历过互联网校招的同学来说,笔试环节永远是最让人心情复杂的一关。尤其像京东这种体量的大厂,2017年校招技术类选择题(一)这套卷子,在当年算是一个很典型的样本——题目不算偏怪,但覆盖面非常广,数据结构、操作系统、网络、数据库、语言特性都有涉及。很多同学拿到卷子第一反应是“好像都见过”,第二反应是“但就是拿不准”。这篇文章不打算去还原某一道具体的题目,因为那样意义不大;我更想把这套题背后真正在考的东西拆出来,梳理成一份可复用的备考框架。无论你准备的是哪一年的校招,这套思路基本都通用。
1. 这套题到底在考什么:一份2017年京东校招技术选择题的考点画像
1.1 先从试卷结构说起
京东2017校招技术类选择题(一)面向的是技术类岗位的统一笔试,考查范围横跨计算机专业的核心基础课。按当年的考试形式,这套卷子以选择题为主,少则四五十道、多则六七十道,答题时间一般控制在60到90分钟。这里有个很关键的信息:选择题是机器阅卷,所以考查的更多是“准确判断”而不是“推导过程”。
这与面试中的手写代码或系统设计题有本质区别。选择题的每个选项都是命题人精心设计的干扰项,你不仅要会做,还要在有限时间内快速识别陷阱。这套卷子里不少题目的干扰项设计得非常用心,不是简单的“错误答案”,而是“看似正确但在边界条件下不成立”的答案。换句话说,它考的不只是知识点记忆,更是对概念边界的理解程度。
1.2 科目权重与考点分布
根据我当时做题的感受以及后续和同学对答案的反馈,这套卷子的考点分布大致可以归纳为下表。这里要说明的是,这不是官方数据,而是基于题目类型和频率的回忆归类,但方向上不会差太多。
| 科目 | 典型考查方向 | 题量占比(估算) | 备考优先级 |
|---|---|---|---|
| 数据结构与算法 | 二叉树遍历、排序算法、哈希表、堆 | 30% | 高 |
| 操作系统 | 进程与线程、死锁、内存管理 | 20% | 高 |
| 计算机网络 | TCP/UDP、HTTP、拥塞控制 | 15% | 中高 |
| 数据库 | 索引、事务、SQL语法 | 10% | 中 |
| 编程语言与Linux | C++/Java语言特性、常用命令 | 15% | 中 |
| 场景与逻辑题 | 推理、计算、综合应用 | 10% | 中 |
从这个分布可以很清楚地看出,这套卷子的核心逻辑是:以数据结构与算法为中心,以操作系统和网络为两翼,配合数据库和语言基础作为辅助考核项。这几乎就是国内互联网公司校招笔试的“标准配方”。如果你备考时间有限,优先把数据结构和操作系统吃透,就能覆盖整套卷子将近一半的分数。
有一个容易忽略的点:2017年的时候,前后端还没有像现在这样彻底分家,很多岗位统称为“技术类”,所以这份卷子并不区分Java岗或C++岗,所有人都做同一套基础题。这就要求你在复习时不能只盯着自己常用的语言特性,计算机通用基础反而才是大头。
2. 高频考点逐项拆解:能拿分的硬骨头都集中在哪里
2.1 数据结构与算法:二叉树和排序从来不会缺席
先说二叉树。选择题里关于二叉树的考法一般是三种:遍历序列互推、二叉树性质计算、特殊二叉树(如二叉搜索树或平衡二叉树)的调整过程。遍历序列互推的题目很经典,比如给一个前序遍历序列和中序遍历序列,让你选后序遍历序列。这种题型的核心思路是:前序序列第一个元素一定是根节点,然后去中序序列里找到这个根节点,左边是左子树、右边是右子树,递归往下推就行。
另一个非常高频的考点是排序算法的稳定性与时间复杂度。2017年这套题里,排序相关题目几乎每年都会换个角度出现。你需要顺手背下这张表:
| 排序算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|
| 冒泡排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
| 快速排序 | O(n log n) | O(n^2) | O(log n) | 不稳定 |
| 归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 |
| 插入排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
| 希尔排序 | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
| 选择排序 | O(n^2) | O(n^2) | O(1) | 不稳定 |
很多人记不清“快排为什么不稳定”。举例来说,序列 [3, 3, 1],以第一个3作为基准值做分区,第二趟排序后后面的3可能被换到前面来,所以不稳定。这种细节正是选择题喜欢考的点。
链表相关的题目也经常出现,特别是“判断链表是否有环”“查找链表倒数第K个节点”这类经典问题。答题时只需要记住快慢指针的口诀:快指针每次走两步,慢指针每次走一步,若存在环则必然相遇。这种题目在笔试中出现频率极高,几乎不需要复杂思考,属于送分题,但前提是你确实做过一遍。
2.2 操作系统:进程、线程与内存管理的考法
操作系统部分的题目,我印象中主要聚焦在三个地方:进程状态切换、死锁产生条件、虚拟内存与页面置换算法。
进程三态模型(就绪、运行、阻塞)是基本面,但这套题很少直接问你三个状态的名字,而是喜欢用“某种事件发生后进程状态如何变化”这种应用型问法。比如某进程正在运行,此时它发出一个I/O请求,状态会怎么变?答案是运行态变成阻塞态。为什么不是就绪态呢?因为就绪态只表示“万事俱备、只欠CPU”,而I/O请求意味着进程此时缺少除CPU之外的资源,必须先阻塞等待。
死锁的四个必要条件(互斥、请求保持、不可剥夺、循环等待)基本是每年必考,而且经常以“以下哪种做法可以打破死锁”的形式出现。你只需要记住一个粗线条的逻辑:破坏任意一个条件,死锁即不再成立。比如通过资源一次性分配可以破坏“请求保持”,通过允许抢占可以破坏“不可剥夺”。
内存管理部分,页面置换算法是另一个高频点。OPT(最优置换)、FIFO(先进先出)、LRU(最近最久未使用)三种算法需要对比掌握。这里有一个常见的记忆误区:OPT算法在实际系统中是不可能实现的,因为它是“理想状态”,需要预知未来的访问序列;选择题里如果问你“哪种算法实现代价最高但性能最优”,答案一般是OPT。而LRU是实际系统中近似实现OPT的一种算法,利用“过去的访问历史”来推测“未来的访问概率”,是一种合理折中。
我当时在这类题目上丢过分,原因是记混了FIFO和LRU在缺页次数上的表现。记忆技巧很简单:FIFO存在一种叫做“Belady异常”的现象,即分配给进程的物理块数增加时,缺页次数反而可能增加;而LRU不会出现这个问题。这个“异常”两个字是选择题非常喜欢的命题切入点。
2.3 计算机网络:TCP三次握手和拥塞控制是必考
网络部分的题目集中在TCP/IP协议栈,尤其是传输层。三次握手的流程细节我必须建议每一位准备校招的同学都画得出来:客户端先发送SYN=1、seq=x的报文段,服务器收到后回复SYN=1、ACK=1、seq=y、ack=x+1,最后客户端再发送ACK=1、seq=x+1、ack=y+1,连接建立。
选择题的陷阱点通常在“第二次握手服务器发送的seq和ack分别是什么”以及“第三次握手能不能携带数据”这类细节上。关于后者答案是:第三次握手可以携带数据,而前两次不能。原因是前两次握手时,连接还未建立,接收方无法确认发送方的序列号是否可靠,携带数据会有风险;第三次握手时,双方已经确认了序列号,数据可以直接捎带过去。
拥塞控制这一块,慢启动、拥塞避免、快重传、快恢复四件事必须理清。特别是“拥塞窗口”和“接收窗口”的区别:拥塞窗口是发送方根据网络拥塞程度动态调整的,接收窗口是接收方根据自身缓存能力通告给发送方的,发送方的实际发送窗口取两者的较小值。这个“两者取最小值”的规则是一道经典选择题。
还有一个容易被忽略的知识点:HTTP协议本身是无状态的,Cookie和Session机制的出现是为了弥补这个缺陷。Cookie存储在客户端浏览器,Session存储在服务端。选择题如果问“Session ID通常通过什么方式传递给服务器”,标准答案是Cookie,但也可通过URL重写传递,这个补充信息往往是区分度所在。
2.4 数据库与Linux:看似基础,其实最容易丢分
数据库部分的题目不算多,但经常出现在“最容易丢分”的榜单上。原因很简单:很多同学对数据库的学习停留在使用层面,对内部原理理解不够深。
索引相关的题目几乎必考。你需要掌握B+树作为数据库索引底层结构的原因:B+树的所有数据都存储在叶子节点,且叶子节点之间通过指针相连,这样进行范围查询时只需要遍历叶子节点链表即可,效率极高;同时树的高度低,磁盘I/O次数少。相比B树,B+树的非叶子节点只存储索引信息,不存储数据,因此同样的磁盘空间可以容纳更多索引项,树更矮。
事务隔离级别也是一个热门考点。四个级别从上到下:读未提交、读已提交、可重复读、串行化。它们的并发能力从高到低,而隔离性从低到高。不同隔离级别下可能出现的异常现象需要记住:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | 可能 | 可能 | 可能 |
| 读已提交 | 不可能 | 可能 | 可能 |
| 可重复读 | 不可能 | 不可能 | 可能 |
| 串行化 | 不可能 | 不可能 | 不可能 |
最常见的问法是“MySQL默认的隔离级别是什么”,答案是可重复读。但这里有个细节,很多教材强调PostgreSQL默认是读已提交,这让一部分同学混淆了。注意审题,题目问的是哪个数据库,答案会完全不同。
Linux部分的题目比较直接,常考的就是文件权限、管道命令和常用文本处理工具。比如grep是按行匹配文本内容的,awk是按列处理文本的,sed是流编辑器,三者功能有重叠但侧重不同。选择题如果给你一个具体场景让你选命令,核心就是看场景里强调的是“按行”“按列”还是“替换/删除”。这个点在一分钟内就能判断出来,但前提是你在复习时真的敲过这些命令。
3. 选择题的解题节奏:在60分钟里稳住的几种实战打法
3.1 先做熟悉的,再啃硬骨头
我记得当年做这套题的时候,最让我紧张的不是题目本身难,而是时间不够用。60到90分钟做几十道选择题,平均每道题只有一分多钟,一旦在某道题上卡住,后续节奏就会崩。
我总结的应对方法是:第一遍快速扫题,只做那些一眼就能确定答案的题目;遇到需要计算或推理的,先跳过,在题目序号上做个标记;全部做完一遍之后,再回头集中攻这些“中期题目”。这个策略的本质是确保单位时间的得分最大化——先拿稳基础分,再用剩余时间冲击难题。
3.2 善用代入法与排除法
选择题的特殊优势在于,答案就摆在那儿。如果你对某道题的判断不是很有把握,代入法往往能帮你找回信心。
举一个典型的排序算法例子:题目给出一个待排序序列和第一趟排序后的结果,问用的是哪种排序算法。这种题如果靠记忆去匹配每种排序的过程,容易出错;但如果你把几种排序算法都快速演算一遍第一步,再和题中给出的结果一比对,基本就能锁定答案。选错了也能通过排除法排除两到三个明显不符合的选项。
3.3 不会的题用边界值缩小范围
有些选择题的选项描述非常抽象。比如“以下哪种情况不会导致死锁”,四个选项分别描述不同的资源分配策略。这时候用边界值法非常有效:构造一个极端的例子,看哪个选项在极端条件下仍然成立。
比如有一个选项是“进程按序申请资源”,你可以构造两个进程各持有一个资源同时请求对方资源的场景,看它能否避免死锁。如果极端场景下选项描述不成立,这个选项就是错误的。这种方法特别适用于考察概念边界的选择题,因为选择题命题人最常用的手段就是“把正确概念外推到它不适用的场景”。
3.4 时间分配的建议
另外,我个人的习惯是每道题最长不超过3分钟。综合这些实际经验,我给出一套比较靠谱的时间分配参考,但你可以根据自己的强弱项调整:
- 第一遍快速扫题(会做的直接选):占时约20%
- 第二遍集中攻计算和推理题:占时约60%
- 最后一遍检查标记题和不确定项(顺便涂卡):占时约20%
最重要的是,不要在一道题上恋战。一道选择题分值再高也有限,但浪费的5分钟可能导致你后面连续错过三道本可以拿分的题。
4. 当年这套题背后的命题逻辑:为什么校招笔试爱考这些
4.1 校招题考核的是“地基”,不是“花活”
认真分析完京东2017校招技术类选择题,你会发现一个有意思的现象:整套卷子几乎没有考查任何“热门框架”或“新潮技术”,没有微服务,没有容器,也没有人工智能。这并不是说京东不重视这些方向,而是校招笔试的定位决定的。
校招面向的是尚未进入工业界的应届生,大家在技术栈上不可能完全对齐。有人懂Java、有人懂C++、有人专门研究算法,如果用具体框架出题,对没接触过的同学极不公平。所以笔试只能回归所有计算机专业学生都学过的核心基础课,用这些共性知识来筛选候选人的逻辑思维和基本功底。数据结构考察的是逻辑组织能力,操作系统考察的是资源调度思维,网络考察的是通信协作理解,数据库考察的是数据抽象与检索设计——这些才是技术从业者长期发展最核心的底层能力。
4.2 选择题形式筛选的是“准确性”与“反应速度”
可能有人会质疑:笔试为什么非要用选择题?写代码不是更能体现真实水平吗?但大型校招的候选人数量非常庞大,动辄数万人,完全靠人工批改代码不现实。选择题天然适合机器阅卷,能够在极短时间内完成大规模筛选,把候选人的范围压缩到适合进入面试轮次的比例。
选择题的另一个隐藏优势是它要求你“快速做出准确判断”。在实际工作中,很多场景并不需要你从零推导一个理论,而是需要你在多个方案之间快速做出合理选择。判断力的本质,就是你脑子里是否存储了足够多、足够准确的概念模型。选择题恰好就是在检测这件事。
当然这不意味着手写代码不重要——初筛之后的技术面试一定会有算法手写环节,那个才更贴近真实的编码能力考核。
4.3 笔试和面试的联动:题目考点往往是面试预告
根据我的观察,笔试中的高频考点,大概率会在后续面试中被追问得更深。比如笔试考了TCP的三次握手,面试官就可能问“为什么是三次而不是两次”;笔试考了B+树索引,面试官就可能追问“B+树和B树的区别具体在哪些方面”。
这意味着你为笔试做的复习不只是一次性的应试准备,它同时是在为面试积累知识图谱。建议你备考时不要只记结论,而是把每个考点背后的“为什么”也想清楚。这样笔试和面试的复习就能形成联动效应,用一份时间达到两分效果。
5. 从一套题到一类题:备战校招技术选择题的实操路径
5.1 别只盯着目标公司的题库
很多同学准备笔试时有个误区:只找目标公司往年的真题刷。但实际上,2017年京东这套题和同期的阿里、腾讯、百度笔试题在考点上有极高的重合度。大家都是围绕那几门核心基础课出题,区别只在于出题角度和难度偏好。比如阿里更爱考算法与数学推导,腾讯更爱考数据结构和C++语言特性,京东的整体风格是基础但覆盖面广、不偏门。
所以我的建议是:以目标公司的真题为主线,以其他大厂的同类型题目为补充,把常见考点全部覆盖一遍。不要抱有“我就只考京东,只看京东的题就够了”的想法,大厂的题库往往存在相互参考的情况,尤其是经典题型。
5.2 按考点建自己的错题卡片
如果要说我当年备考最大的教训,就是光刷题不复盘。刷了几百道题,当时感觉全掌握了,两周之后再做类似的题目,依然会犯同样的错误。后来我改用了一种笨但有效的方法:建立一个错题文档,按照“考点、题目、错误选项、错因、正确思路”五个字段来记录每道错题。
比如操作系统死锁这道题,记录下“错误选项:破坏互斥条件;错因:把互斥和‘允许共享’混为一谈;正确思路:互斥条件是由资源本身特性决定的,无法通过策略破坏”。这样复习的时候直接翻错题文档,而不是从头到尾刷题,效率高很多。
这里建议你按照数据结构和算法、操作系统、计算机网络、数据库、其他这样归类错误,方便针对性补强。我当年整理的错题卡片帮了大忙,后来面试复盘时也经常翻出来看。
5.3 限时训练是唯一可靠的模拟方式
这里需要专门提醒一句:千万别把做题当成刷剧,觉得慢悠悠地做、查着资料做也算做过了。如果平时习惯“一边看答案一边做题”,考场上的时间压力会放大你所有的知识漏洞。
建议至少留出3到5个完整的时间段,用闹钟或者计时器严格限定一套真题的时间,模拟真实的考试节奏。做题时不要翻书、不要查资料、不要停顿。做完之后,不管分数高低,都要逐题复盘:这道题为什么错?是知识点不熟,还是题目没看清?还是选项之间存在迷惑性?把错误原因分类,就能知道自己复习的优先级。
一套合格的限时训练要达到的效果是:做完后你甚至能感觉到“哪类题自己花的时间最多”,这个觉察比任何模拟分数都珍贵。
5.4 校招笔试的真实作用与心态调节
我见过一些同学因为笔试成绩不理想就陷入焦虑,觉得“没戏了”。但笔试真的只是整个校招流程中的一个环节,而且不是决定性环节。它的作用是把明显不合格的人筛掉,而不是选出“最优秀”的人。换句话说,笔试是资格赛,不是决赛;只要过线,你的成绩就不会影响后续面试的评判。
所以做题的时候,心态上不用太紧绷。如果碰到一道不会的题,可以先标记一下,把后面能拿的分都拿了,再回来处理。遇到自己完全没听说过的知识点,也不要惊慌,能排除一个选项就是赚到一分。
我在做题时还有一个习惯:把不确定答案的题目标上“?”标记,全部做完之后统一再检查一遍。检查时重点看题干里的关键词——“不正确”“错误”“不属于”这类否定词,是最容易因为粗心看漏的。出了考场很多同学对答案时才捶胸顿足:“啊,我看错了,题目问的是不正确的!”这种低级错误在每年的笔试里都非常普遍,千万别犯。
回顾整个备战过程,2017年那套题带给我的不只是几个知识点的查漏补缺,更重要的是一种“用框架代替背诵”的复习意识。每门课的知识都是网状的,而不是线性的。选择题考的是网上的关键节点,你只要把每个节点周围的概念边界理解清楚,无论题目怎么换角度出,都能从容应对。而这份经验和判断力,在后来漫长的工作里,反而比那张笔试成绩单更有价值。