2023年秋招京东技术通用岗第二批笔试,我踩过的坑和复盘笔记
又到一年秋招季,回想自己去年的笔试经历,感触挺多的。尤其是京东技术通用岗位的笔试,题目难度不算变态,但覆盖面很广,出题思路也挺有代表性。这篇文章就围绕2023年秋招京东技术通用岗位第二批笔试展开,把当时的题型分布、考点细节、做题顺序、答题策略和踩坑记录完整梳理一遍,给后面准备技术岗笔试的同学做个参考。如果你正在备战类似大厂的技术岗,这篇文章能帮你少走不少弯路。
京东技术通用岗位的笔试通常不区分太细的技术方向,后端、前端、客户端、测试开发的候选人可能共用同一套卷子,所以考察内容偏向通用计算机基础,而不是某个特定框架的深入应用。这意味着你需要把数据结构、算法、计算机网络、操作系统、数据库这些基础科目都过一遍,而不是只刷自己熟悉的语言题。第二批笔试的题目结构和第一批基本一致,但具体题目有差异,整体难度保持稳定,没有出现偏题怪题,这点比较友好。
1. 笔试整体情况与准备思路
1.1 题型分布和分值结构
先说一下这场笔试的基本盘。2023年秋招京东技术通用岗位第二批笔试采用的是在线笔试系统,全程监控,总时长大约两个小时左右,题量不算少,需要合理分配时间。整个试卷分为三大部分:第一部分是逻辑推理与数据分析类选择题,第二部分是计算机基础类选择题,第三部分是编程题。
第一部分和第二部分合计大约30到40道选择题,每道题分值不高,但覆盖面极大。第三部分编程题一般有2到3道,分值占比很高,是拉分的关键。从笔试通过情况来看,编程题做得好不好基本决定你能不能进入面试环节,选择题大家差距反而不大。
这个结构其实很符合大厂技术岗的筛选逻辑。选择题考察的是知识面的广度和基础概念的扎实程度,编程题考察的是代码能力和解决问题的思维水平。单独看任何一部分都不难,但组合在一起,两个小时内的压力还是不小的。
提示:不同批次的题量和分值可能会微调,但大体框架不变。准备时不要把希望全押在某一部分,选择题和编程题都要兼顾。
1.2 备考资料和复习侧重点
针对这种考察结构,我当时的复习策略是分三步走的。第一步是把计算机网络、操作系统、数据库这三门课的核心知识点过了一遍,不需要深入啃教材,重点是概念清晰、原理理解到位。第二步是针对性地刷了一些大厂历年真题和牛客网上的模拟题,尤其是选择题部分,刷题能帮你快速找到知识盲区。第三步是集中时间练编程题,用LeetCode和牛客网的题库做专项训练。
复习侧重点上,选择题部分要特别注意计算机网络的分层结构、TCP和UDP的区别、滑动窗口机制,操作系统的进程调度算法、死锁条件、虚拟内存,数据库的索引原理、事务ACID特性、范式判断。这些都是高频考点,每场笔试基本必出。编程题部分则要重点准备字符串处理、数组和链表操作、动态规划基础、二叉树遍历,以及一些简单的贪心算法题目。
有一点需要提醒的是,京东的笔试题目比较注重基础但不刻板,选择题里经常会有“下列哪种情况会导致死锁”这类需要理解分析的题,而不是直接考“死锁的四个必要条件是什么”这种纯记忆题。所以复习时不要只背结论,要把原理理解透,做题时才能灵活判断。
2. 技术考点深度解析
2.1 计算机网络考点复盘
计算机网络是选择题的绝对大户,基本每场笔试都会占到六到八道题。涉及的考点主要集中在TCP/IP协议栈、HTTP协议、TCP可靠传输机制、IP地址与子网划分这几个方向,覆盖面广但难度不大,算是送分题和送命题的分水岭。
我当时遇到的一个高频考点是TCP的拥塞控制机制。题目会给定一个场景,例如某个连接当前的拥塞窗口大小,然后问你经过一轮传输后窗口会怎么变化。这个知识点需要清楚慢启动、拥塞避免、快重传、快恢复这几个阶段的触发条件和窗口变化规则,光记概念不够,得会算。
还有一个重点就是HTTP协议的状态码和缓存机制。京东的笔试比较喜欢考301和302的区别、Cache-Control和Expires的优先级、Cookie和Session的区别。这些知识点在企业实际开发中天天用到,出题人考察的意图很明显:不希望你只会写代码,还要理解网络交互的底层逻辑。
另外,子网掩码和IP地址的计算也出现过。一般来说会给你一个IP和一个前缀长度,让你算网络地址、广播地址或者可用主机数。提前要记住,子网划分计算本身不难,但考试时时间一紧就容易算错,平时复习一定得多练几遍。
# CIDR地址计算示例:192.168.1.0/26 # 子网掩码:255.255.255.192 # 可用地址数:2^(32-26) - 2 = 62 # 第一个可用地址:192.168.1.1 # 最后一个可用地址:192.168.1.62注意:计算机网络的选择题有不少细节陷阱,比如“TCP的确认号是期望收到对方下一个报文段的序号”这种表述会用来混淆你。复习时建议把TCP和UDP的头部格式、连接建立释放流程、可靠传输原理都吃透。
2.2 操作系统核心考点
操作系统部分的考点集中在进程管理、内存管理和调度算法这三个方向,题量比计算机网络略少,但同样不容忽视。
进程管理是必考内容,尤其是死锁的判断。题目会给你一个资源分配的场景,比如多个进程同时持有并请求资源,问会不会发生死锁。这种题要用银行家算法去判断,或者直接分析是否满足死锁的四个必要条件。我在笔试时就遇到了一道经典的哲学家就餐问题,题干也明确提示了一点:当所有哲学家同时拿起左边的筷子时会怎样?答案是会发生死锁。
内存管理方面,虚拟内存和页面置换算法是高频考点。LRU、FIFO、OPT这三种置换算法要会手算缺页次数,这部分难度不大,但需要细心,因为缺页次数的计算很容易出小错误。京东这批笔试还考了一道关于段页式管理的题目,问一个逻辑地址如何转换到物理地址,要求考生理解段号和页号的组合关系。
调度算法部分,常见的先来先服务、短作业优先、时间片轮转、优先级调度都有可能会考。重点在于会计算平均等待时间和平均周转时间,这需要你把甘特图画出来,一步步算,没有太多捷径。做题时建议养成先在草稿纸上列出进程到达时间和服务时间的习惯,再按算法规则模拟执行过程,避免漏算。
2.3 数据库与数据结构重点
数据库部分的核心考点集中在SQL语句、索引和事务特性。SQL题一般不难,考察的多是单表查询和简单的多表连接查询,偶尔会有GROUP BY和HAVING的组合查询,写对就得分。索引部分要理解主键索引、唯一索引和普通索引的区别,知道什么情况下索引会失效。
事务ACID特性基本上是必考题,尤其要注意隔离级别和对应的问题。读未提交会导致脏读,读已提交可以避免脏读但会出现不可重复读,可重复读可以避免不可重复读但可能出现幻读,可串行化解决了所有问题但性能最差。这个知识链路要背熟,考试时经常以实例形式出题。
数据结构部分,选择题经常考察栈和队列的特性、二叉树的遍历方式、图的存储结构、哈希表的冲突处理方式。二叉树遍历是重中之重,给一个前序和中序序列让你求后序序列的题几乎每场都能碰到,解题思路是依靠中序序列来区分左右子树,再结合前序或后序确定根节点,递归还原整个二叉树结构。
# 根据前序遍历和中序遍历重建二叉树 def build_tree(preorder, inorder): if not preorder: return None root_val = preorder[0] root_index = inorder.index(root_val) left_inorder = inorder[:root_index] right_inorder = inorder[root_index + 1:] left_preorder = preorder[1:1 + len(left_inorder)] right_preorder = preorder[1 + len(left_inorder):] root = TreeNode(root_val) root.left = build_tree(left_preorder, left_inorder) root.right = build_tree(right_preorder, right_inorder) return root我自己在复习二叉树重建时,一开始总是想背代码模板,后来发现其实只要理解了递归切分数组的逻辑,代码怎么写都是通的。不要死记硬背,要理解每一步在做什么。
3. 编程题实战解析
3.1 第一批典型编程题思路与解法
京东笔试的编程题通常有2到3道,难度从简单到中等递进。第一批的题目我没有赶上,但根据身边同学的反馈和社区里大家的讨论,能大致推测第二批的题目风格。编程题不求你用多么高深的算法,更重要的是把思路表达清楚、代码写得干净、边界情况处理好。
有一道比较典型的编程题是数组去重和排序的变体,给你一个整数数组,要求先按照出现次数降序排序,如果出现次数相同则按照数值升序排序,输出排序后的数组。这道题本质上考察的是哈希表统计加自定义排序,用Python的Counter类或者Java的HashMap就能解决。
from collections import Counter def custom_sort(arr): counter = Counter(arr) sorted_items = sorted(counter.items(), key=lambda x: (-x[1], x[0])) result = [] for num, count in sorted_items: result.extend([num] * count) return result这题其实不难,但很多人在“出现次数相同按数值升序”这个排序条件上栽了跟头。如果用冒泡排序,排序函数写得不对就会出错。建议用语言内置的排序接口,重写比较逻辑时就非常方便。
还有一道题是模拟栈的先进后出实现队列的先进先出。这道题用两个栈来模拟队列,一个栈负责入队,一个栈负责出队。出队时如果出队栈为空,就把入队栈的所有元素依次弹出并压入出队栈,这样元素的顺序就反过来了,再从出队栈弹出时就能实现先进先出。边界条件就是两个栈都为空时不能做出队操作,要抛出异常或返回特定值。
3.2 第二批编程题的常见考法与思考过程
第二批编程题整体风格和第一批很相似,但从网上反馈和我个人的做题感受来看,题目的题干描述更长,场景包装更多,不再是简单地列一个输入输出格式,而是把题目藏在一段业务描述里,需要你从中抽象出核心问题。
举个例子,有一道题是所有可能的路径问题,类似走迷宫,但加了一些条件限制。题目场景包装成物流配送,说有一个网格状的仓库,从左上角出发到右下角,网格中某个值为1代表有障碍物,不能走,问有多少条不同的路径。这就是典型的动态规划或者递归加记忆化搜索问题。
def unique_paths_with_obstacles(grid): m, n = len(grid), len(grid[0]) dp = [[0] * n for _ in range(m)] dp[0][0] = 1 if grid[0][0] == 0 else 0 for i in range(m): for j in range(n): if grid[i][j] == 1: continue if i > 0: dp[i][j] += dp[i - 1][j] if j > 0: dp[i][j] += dp[i][j - 1] return dp[m - 1][n - 1]这个状态转移方程其实很简单,就是每个格子只能从上面或者左边走过来,障碍物的格子特殊处理为0即可。
另一道题是经典的连续子数组最大和问题演变而来,但题目加了一个限制:选择的子数组长度不能超过k。这个问题不能直接用贪心或者简单遍历解决,得用滑动窗口配合前缀和数组去处理,时间复杂度要控制在O(n)。如果没用前缀和,暴力解法在数据量大的时候必然超时。
说一下我做题的思考过程吧。拿到一道编程题,我一般先不看数据范围,而是先把题目读懂,看清它到底要解决什么问题。然后把题目简化为我们熟悉的算法模型,比如看到“连续”“最大”“最小”就联想到滑动窗口或动态规划,看到“路径”“方案数”就联想到DP了。确定模型之后,再根据数据范围决定用什么复杂度级别的算法,最后才动手写代码。这个流程在笔试时非常重要,能帮你快速进入状态。
3.3 做题顺序和时间分配
编程题的分值重,但也不要一上来就死磕最难的题。我当时的策略是先快速浏览三道题的题干,对难度有个大致判断,然后从自己最有把握的题开始做。先把能拿的分全拿到手,再回头啃难题。这样做的好处是不会因为纠结一道题耽误太多时间,导致后面会的题也没时间写。
每道编程题的时间控制在20到25分钟左右,如果超过这个时间还没有清晰的思路,就先放下,做完其他题再回来想。做题时先把暴力解写出来保底,再想办法优化,能优化就优化,不能优化就算了。毕竟暴力解可以通过一部分测试用例,写不出来优化方案也不至于拿零分。
注意:在线编程环境一般支持多种语言,选自己最熟练的那个。笔试时我身边的同学普遍选java、cpp或者python,没有哪个有绝对优势,关键在于熟练度和边界处理能力。选一个你最不容易写错的语言就好。
4. 笔试中的细节技巧与常见问题
4.1 在线笔试系统使用技巧
京东的笔试用的是第三方在线笔试平台,网页会有一个代码编辑器、一个答题区、一个题目切换区。正式开考前会有一个模拟测试环节,一定要利用好这段时间来熟悉页面操作,特别是代码编辑器的用法和测试用例的运行逻辑。
几个实用的操作技巧:第一,代码编辑器一般支持自动补全,但不同平台的补全能力不一样,平时练习就别太依赖自动补全,考试时才能快速适应。第二,选择题部分可以直接在页面上做标记,对拿不准的题先标记好,做完其他题回来再核实,不要在一道选择题上纠结太久。第三,编程题部分提前搞清楚是从标准输入读取数据还是从函数参数传入数据,这两种模式下代码的写法差别很大,搞错了会浪费大量调试时间。
我当时就吃过这个亏,有一次把需要从标准输入读取数据的题目用了函数传参的方式去写,结果运行直接报错,多花了十分钟才反应过来问题出在哪。现在想想,这个错其实很好避免,开考前认真看示例代码就行。
4.2 选择题的蒙题策略和常见陷阱
选择题遇到完全不会的题怎么办?我的原则是:先从确定性最高的答案入手,优先排除明显错误的选项,再结合单选题和多选题特点进行判断。京东的笔试选择题以单选为主,部分可能是多选,大家一定要仔细看题干说明,不要白白丢分。
常见的陷阱主要有这几类:第一类是把条件偷换,比如问TCP可靠传输时,把“确认号是下一个期望接收的序号”偷换成“确认号是最后一个已接收的序号”。第二类是混淆两个相近概念,比如“进程”和“线程”的区别,“NAT”和“代理”的区别。第三类是数值计算陷阱,例如子网划分中可用的主机数要减掉网络地址和广播地址,很多人忘了减2。
比较实用的一个技巧是,对于不会的知识点,可以根据选项之间的关系反推。如果四个选项里有两个明显意思相近,正确答案很可能就是它们中的某一个;如果有一个选项和其他三个风格完全不同,那它通常是用来凑数的干扰项。当然这个技巧只能在完全不会的时候用,会做的题还是老老实实按知识点判断。
4.3 编程题的边界条件和debug技巧
编程题最容易翻车的点不是算法不会,而是边界条件处理不周全。我自己在笔试时就遇到过这样一种情况:题目说输入数组中可能有重复元素,问某个指定元素第一次出现的位置。我当时没考虑数组为空的情况,结果有一个测试用例直接越界报错了。这类错误哪怕算法完全正确,也会因为边界问题扣分,非常可惜。
写代码时要注意检查的边界条件包括:输入是否为空、数组长度是否为0或1、目标值是否存在、下标是否越界、整数溢出等。程序里稍微处理一下这些情况,排错成本很低,收益却很明显。
debug技巧方面,在线笔试环境一般没有断点调试功能,只能在代码里加print来排查。如果你在本地IDE上能运行,在笔试页面上却报错,优先检查输入输出的读取方式是否正确,特别是不是多了空格或者换行符。另外,运行超时不一定是你算法复杂度太高,也可能是因为你在循环里做了不必要的字符串拼接或重复计算。
5. 从笔试复盘到面试准备
5.1 笔试后应该做哪些事
笔试结束并不意味着万事大吉。考完当天趁记忆还清晰,赶紧把题目回忆一遍,能记住多少记多少。然后对比牛客网上别人发的笔经,看看哪些题做对了、哪些题做错了、哪些题是蒙的,记录成文档。这看似麻烦,但能让你清晰地知道自己的薄弱点在哪,同时为后续其他公司的笔试积累题库。
我在京东笔试结束后就整理了一份文档,把错题涉及的知识点都标注了出来。后来集中复习时直接看这份文档,效率比重新看一遍教科书高得多。这种习惯不是只针对京东有效,整个秋招过程中都能用。
5.2 从笔试看面试的重点方向
京东技术岗的笔试考察范围和面试问的重点方向高度重合,基本集中在计算机网络、操作系统、数据库和算法这几个核心领域。笔试中出错的知识点大概率会成为面试时考察的重点,这是很多参加过秋招的人的共识。所以笔试复盘实际上就是在为面试做准备。
举个例子,如果笔试时TCP三次握手和四次挥手的题型做错了,面试官可能就会追问time_wait状态的作用、为什么需要这个状态等问题。如果笔试时动态规划的题没做出来,面试手撕算法时很可能会遇到同类题。因此笔试的错题、不会的题、蒙对的题,都是后续复习的重要线索。
建议按照面试常问清单重新梳理一遍各个知识点,包括TCP和UDP的区别与应用场景、HTTP和HTTPS的区别与加密流程、进程与线程的区别与联系、数据库索引的底层数据结构、事务隔离级别与锁机制、HashMap的底层实现与扩容机制、垃圾回收算法的基本思路。这些既是笔试高频考点,也是面试必问的题目。
5.3 复盘时值得记录的知识清单
把自己在准备过程中要重点记录的知识点整理成了一个清单,分享给各位参考:
- TCP的拥塞控制:慢启动、拥塞避免、快重传、快恢复的具体行为和触发条件。
- IP地址分类与子网划分:A/B/C类地址范围、CIDR表示法、可用地址数计算。
- HTTP状态码:301与302的区别、403与404的区别、500与502的区别。
- 操作系统的进程调度算法:先来先服务、短作业优先、时间片轮转、多级反馈队列。
- 死锁的必要条件与预防措施:互斥、持有并等待、不可剥夺、循环等待。
- 虚拟内存与页面置换:LRU、FIFO、OPT算法及缺页率计算。
- 数据库索引:B+树与哈希索引的区别、联合索引的最左前缀原则、索引失效场景。
- SQL语句:多表连接、聚合函数、GROUP BY与HAVING的使用场景。
- 数据结构:二叉树遍历、数组和链表的时间复杂度对比、栈与队列的应用场景。
- 算法模型:动态规划、贪心、滑动窗口、双指针、回溯的经典题目和模板代码。
我在实际秋招过程中,发现把这些清单过完一遍后,不管是京东的笔试还是其他公司的笔试,都心里有底很多。基础扎实了,题目再怎么变,核心考点始终绕不开这些内容。
提示:不要以为这些只是校招笔试的内容,社招跳槽时很多公司也会考类似的知识点,只是难度和深度上会有所提升。准备一次,受益多次,这笔时间花得很值。
以上就是我对2023年秋招京东技术通用岗位第二批笔试的全部复盘。整体看下来,这场笔试的难度对科班学生来说处于中等水平,对非科班同学来说需要额外补一些计算机基础,但只要认真准备,通过笔试并不难。编程题别太慌张,选择题别纠结太久,基础知识点吃透了,这场笔试就没有想象中那么吓人。希望大家都能顺利通过笔试,拿到心仪的面试机会。