2023年秋招那阵子,我身边不少同学把京东的笔试通知当成了一个阶段性目标:投了简历之后,大家最怕的不是笔试难,而是连笔试链接都等不到。我也是九月中旬收到的通知,点进去一看,标题写着“技术通用岗位-第四批笔试”。这个岗位和一般的后端、前端岗位不太一样,它更像一个“大池子”,不急着按语言和方向分岗,而是先统一筛一轮基础能力,后面再根据面试表现和部门需求去匹配方向。所以这批笔试的考察逻辑,不是看你某个框架用得有多熟,而是看你计算机基础扎不扎实、代码能力能不能过关、遇到实际问题有没有清晰的解决思路。
这篇文章我按自己的备考过程和实际踩坑经历,把京东技术通用岗位第四批笔试从岗位定位、题型分布、高频考点、编程题思路到临场策略完整拆一遍。后面几批还没笔试的朋友,以及秋招还在海投阶段的应届生,都可以拿这份内容当参考,提前感受一下这批笔试的调性。
1. 笔试基本盘:技术通用岗到底在筛什么人
1.1 “通用”两个字背后的选拔逻辑
技术通用岗和定向开发岗最大的区别,是它不会在笔试阶段就逼你选Java、C++、Go这些语言赛道。你可以在答题时选择自己最熟悉的一门语言,但你面对的题目范围会非常宽:数据结构、算法、计算机网络、操作系统、数据库、Linux基础知识,样样都可能涉及。
这种设置其实有很现实的理由。京东的校招体量很大,业务线很多,不同部门的后端、中间件、基础架构、云计算岗位对技术栈的要求差异巨大。如果笔试一开始就锁定某个方向,对候选人来说太早,对岗位匹配来说也太机械。通用岗位的做法是先把“基本功”这件事考透:你的代码能力决定了你能不能干活,你的计算机基础决定了你后续能学多快。只要这一轮表现足够好,后面部门双选的时候,你就有更多议价空间。
所以我在备考的时候给自己定的基调就是:不做深度钻研,但覆盖面要拉满。具体来说,就是操作系统、网络、数据库、Linux这些课的基础概念必须能快速判断对错,算法题要练到中等难度能在限定时间内写出来,语言特性题只复习自己常用的那一门,别贪多。
1.2 在线笔试的设备和环境要求
京东这批笔试用的是在线考试系统,说白了就是浏览器里打开一个链接,登录后进入答题页面。整体界面分几个区域:左边是题目列表,右边是答题区,选择题直接点选,编程题会在页面里嵌一个在线编辑器,你选好语言后在里面写代码,然后可以运行测试用例。
有几个硬性要求得提前确认清楚。第一,电脑要有摄像头,考试系统会要求人脸识别或全程抓拍,这是防作弊的基础配置。第二,建议用Chrome这类主流浏览器,兼容性比某些偏门浏览器好很多。第三,考试过程中系统会限制切屏,一旦频繁切出考试页面,后台会记录切屏次数,严重的时候可能直接强制交卷。
我那次考试之前特意把电脑上的弹窗广告、输入法、通讯软件全部关掉了,只留下浏览器和本地IDE。虽然在线编辑器能完成所有答题,但遇到复杂编程题时,我习惯先在本地IDE里把思路跑通,再同步到答题页面。这里要提醒一句:如果你打算像我一样用本地IDE验证,一定要控制时间,并且别在编辑器和考试页面之间来回切换太多次,否则容易被系统误判。
2. 题型构成与时间分配策略
2.1 选择题:范围广、题量不小
从往年校招情况来看,京东技术类的笔试通常由选择题和编程题两部分组成。选择题覆盖的面很宽,我印象比较深的有计算机网络、操作系统、数据库、Linux基础、Java或C++语言特性、设计模式,偶尔还会穿插几道简单智力题或逻辑推理题。
这类选择题的特点在于,它们不考背诵,而是考概念理解。比如网络题很可能不直接问你“TCP首部多长”,而是给你一个具体场景,让你判断此时应该用什么协议,或者问状态转换过程中某个标志位的变化。操作系统题也经常是给一段并发代码,问这段代码是否会有死锁风险,或者让你推断某个内存分配的最终结果。
选择到后面的时候,很多人会陷入一种“好像都会,但每个答案都要犹豫”的状态。我的策略是先做有把握的题,遇到犹豫超过一分钟的直接标记跳过,把时间留给后面的编程题。因为选择题的分值通常单题不高,没必要在个别题上死磕。
2.2 编程题:典型的三段式难度分层
编程题一般会有两到三道,难度是有梯度的。第一道往往偏简单,考察基本的字符串或数组操作,更像是“送分题”,让你热热身。第二道开始需要一些算法设计,常见的套路是滑动窗口、双指针、哈希表、贪心、简单动态规划。第三道可能会涉及二叉树、图或者更复杂的动态规划状态设计,用来拉高区分度。
这二十分钟到半小时之间,第三题可能只写部分解法,能过部分测试用例就不亏。
2.3 时间分配表:150分钟怎么花
我按自己参加笔试时的体感,整理了一张时间分配参考表。具体总时长要以你收到的通知为准,但思路可以通用。
| 题型 | 建议用时 | 策略 |
|---|---|---|
| 选择题 | 50-60分钟 | 快速判断,不确定的先标记 |
| 编程题第一题 | 10-15分钟 | 求稳,边界条件写全 |
| 编程题第二题 | 25-35分钟 | 正常难度,先想后码 |
| 编程题第三题 | 35-50分钟 | 能拿部分分就拿部分分 |
| 检查与上传 | 5-10分钟 | 检查编译运行,确认提交 |
这里想多说一句,很多人笔试翻车不是因为不会做,而是因为时间安排失控。选择题做得太慢,把编程题压得只剩四十分钟,后面代码写得手忙脚乱。我的做法是,选择题无论有没有做完,在考试进行到一半左右时都必须停笔,先去看编程题。毕竟编程题分值高,而且写代码本身就比点选择题更耗时。
3. 高频考点复盘:选择题的四个重点板块
3.1 计算机网络:别只背状态码,学会看场景
网络题在技术类笔试里出现频率极高。最经典的是TCP和UDP的区别,几乎每年都会考。但现在的出题方式很灵活,不是简单问你“TCP可靠还是UDP可靠”,而是给你一个直播推流、文件传输、视频通话之类的场景,让你选更适合的传输协议。
备考的时候,我给自己列了一个网络知识清单:TCP三次握手和四次挥手的过程与原因、TCP和UDP特点对比、HTTP常见状态码含义、HTTP与HTTPS的区别、DNS解析流程、IP地址分类和子网划分、常见的负载均衡策略。其中TCP四次挥手里的TIME_WAIT状态是个高频点,很多候选人能说出状态名字,但说不清为什么需要等待。
我当时刷到一道比较典型的题,大意是问客户端主动关闭连接后进入TIME_WAIT状态,为什么需要等待2MSL。答案的核心有两层:一是保证最后一个ACK能送达对端,如果丢失可以重传;二是让旧连接产生的所有报文在网络中自然消失,避免影响新连接。这种题看起来是问状态,实际是考你对连接生命周期问题的理解程度,准备的时候一定要把原理捋透。
3.2 操作系统:死锁、并发和内存管理
操作系统板块的出题点同样非常集中。死锁的四个必要条件(互斥、持有并等待、不可剥夺、循环等待)是必背内容,但笔试更常考的是“如何预防死锁”和“如何避免死锁”。预防和避免是两个维度,预防是破坏条件,避免是使用银行家算法这类动态判断机制。
进程和线程的区别也是老生常谈,但通用岗位的笔试会把问题包装得更新一些。比如问多线程并发访问同一个变量,用哪种同步方式能保证可见性,这就需要你对volatile、synchronized、ReentrantLock或者Python的GIL机制有基本认知。
内存管理这块,我建议重点复习虚拟内存、分页和页面置换算法。LRU是个高频词,不光是操作系统,很多框架和缓存设计里也用它。考试里除了问你LRU是什么,还可能让你搭建一个LRU Cache的数据结构,这就是把操作系统的知识和算法题结合了。
3.3 数据库与Linux:SQL基本功加常用命令
数据库的考察重点集中在索引、事务隔离级别、SQL优化这些高频区域。B+树为什么适合作为InnoDB的索引结构,这个问题的标准答案你至少要能说出三点:叶子节点存数据且形成链表、树高较低减少磁盘IO、范围查询友好。事务的ACID特性、四种隔离级别以及各自解决的问题(脏读、不可重复读、幻读)也要熟练掌握。
我在刷题时发现,数据库题很喜欢给一个SQL执行很慢的场景,让你分析原因并提出优化方案。这种题没有唯一答案,但你的回答里至少要提到几个方向:是否走了索引、有没有全表扫描、数据量级多大、表结构是否合理。哪怕笔试时拿不准最佳答案,把常规排查思路写上去也能得分。
Linux板块相对简单,主要考察常用命令的使用场景。比如查看进程用ps、查看端口占用用netstat或ss、查找文件用find和grep、权限管理用chmod。还有一个高频考点是管道符和重定向的区别。笔试里出现这种题,属于白送分,千万别在这种细节上失分。
3.4 语言基础:选一门,深挖一门
通用岗位不会逼你同时精通C++、Java、Python,但你选来答题的语言,它的核心特性必须足够扎实。
如果选Java,那HashMap的底层结构、扩容机制、Hash冲突处理方式必须能讲清楚。如果选C++,那指针和引用的区别、虚函数与多态的实现原理、智能指针的类型与使用场景都是高频点。如果选Python,那深拷贝和浅拷贝的区别、列表与元组的差异、装饰器的作用,以及GIL对并发的影响,这些都要烂熟于心。
我的建议是不要去背一大堆语言细节,而是围绕“内存管理、并发处理、集合/容器、常见坑点”四条主线来回顾。语言层面的选择题,出题人更想看到你踩过坑、理解过机制,而不是单纯记住语法。
4. 编程题思路拆解与代码模板
4.1 滑动窗口:无重复字符的最长子串
编程题里,字符串、数组方向是最常出现的。有一类经典题目是“给定一个字符串,请你找出其中不含有重复字符的最长子串的长度”。这道题几乎可以当成滑动窗口的模板题来准备,因为很多变体题都是在这个基础上加条件。
我的实现思路是用一个哈希表记录每个字符最近一次出现的位置,然后用left指针维护当前窗口的左边界。遍历字符串时,如果当前字符之前出现过,并且出现位置不小于left,就说明窗口内有重复字符,需要把left移动到上次出现位置的右边一格。每一步都计算当前窗口长度并更新最大值。
def lengthOfLongestSubstring(s: str) -> int: last_pos = {} left = 0 max_len = 0 for right, ch in enumerate(s): if ch in last_pos and last_pos[ch] >= left: left = last_pos[ch] + 1 last_pos[ch] = right max_len = max(max_len, right - left + 1) return max_len这段代码的时间复杂度是O(n),空间复杂度是O(字符集大小)。笔试时,如果时间紧张,写出这种方式是最稳的。需要注意的边界情况包括空字符串、全是同一个字符的字符串,以及重复字符出现在窗口外的情况。
4.2 动态规划:0-1背包问题的标准模板
动态规划是区分度的主要来源。0-1背包问题可以说是动态规划里的必刷题,不夸张地说,理解了它,很多背包类变形题都能一通百通。
题目一般是这样:给定n个物品,每个物品有重量weight和value,再给一个容量为capacity的背包,问能装入的最大价值。每个物品只能用一次。
我习惯用一维dp数组做空间优化。dp[w]表示容量为w时能获得的最大价值。外层遍历物品,内层倒序遍历容量,这样才能保证每个物品只取一次。
def knapsack(weights, values, capacity): n = len(weights) dp = [0] * (capacity + 1) for i in range(n): for w in range(capacity, weights[i] - 1, -1): dp[w] = max(dp[w], dp[w - weights[i]] + values[i]) return dp[capacity]很多人写背包题容易忽略内层循环为什么必须倒序。如果正序更新,一个物品就可能在同一个状态转移中被重复使用,变成完全背包的逻辑。笔试考场上,这种细节很容易被忽略,我的建议是平常练习时就养成写注释的好习惯,把这道题吃透。
4.3 图与连通性:用DFS/BFS遍历网格
还有一类考得越来越多的题是在二维网格上做搜索,比如“岛屿数量”问题。题面给你一个由’1’(陆地)和’0’(水)组成的二维网格,要求计算岛屿数量。这道题考察的点不是你背了什么高级算法,而是你能否在矩阵场景下写出DFS或BFS的遍历逻辑。
我用的是遍历整个网格,遇到陆地就把计数器加一,同时把相邻的陆地全部标记为访问过。标记方式可以直接把’1’改成’0’,这样省去额外空间的消耗,也简化了代码判断。
def numIslands(grid): if not grid: return 0 rows, cols = len(grid), len(grid[0]) count = 0 for i in range(rows): for j in range(cols): if grid[i][j] == '1': count += 1 stack = [(i, j)] while stack: x, y = stack.pop() if not (0 <= x < rows and 0 <= y < cols) or grid[x][y] != '1': continue grid[x][y] = '0' stack.extend([(x-1, y), (x+1, y), (x, y-1), (x, y+1)]) return count这里有一个小技巧:用显式栈代替系统递归,可以避免数据量较大时出现递归深度超限的问题。笔试系统如果用的是Python,递归深度默认只有1000左右,一旦格子数量多,递归写法可能会崩在运行用例上。
4.4 程序题审题与边界处理心得
关于编程题,我最想重点强调的还是“审题”这两个字。笔试紧张的时候,最容易犯的错不是不会做,而是没看清题目要求就开始写。
我总结了几条自己的审题习惯:一、先看输入输出约束,数据量决定算法复杂度上限,这个必须放在第一位;二、再看有没有特殊说明,比如数组是否有序、元素是否为整数、是否可能为空;三、然后用题面给出的示例过一遍思路,确认自己理解的题意和示例一致;四、最后再动手写。
边界情况是另一个失分重灾区。字符串长度为零、数组只有一个元素、某个变量取到最大值导致int溢出,这些都是测试用例最容易埋雷的地方。写最后提交之前,我的习惯是花一分钟把代码里的每个分支条件扫一遍,看看有没有遗漏。
5. 临场实战记录:笔试中遇到的状况和处理方式
5.1 在线IDE和本地编译器之间的选择
这里要好好说说在线IDE的坑。很多校招笔试系统自带在线编辑器,但它的提示、补全、语法检查能力比本地IDE差不少。如果你习惯了PyCharm、VS Code这种全功能环境,突然换到在线编辑框里写代码,很容易犯一些低级错误,比如缩进错乱、括号没对齐、函数名拼写错误。
我的做法是先用本地IDE把思路实现一遍,确认能跑通后再把代码复制到答题页。这个方法在选择题少、时间充裕的时候很有效,但如果选择题做太慢,连本地IDE都来不及打开,那就只能在线编辑器里硬写。所以平时刷题时,我偶尔会刻意把IDE提示关掉,用最原始的编辑器写代码,练一练不依赖补全的代码拼写能力。
5.2 编译通过但运行结果不对时的排查节奏
我这次笔试里遇到一个情况:代码编译通过了,但跑示例用例时结果不对。当时没有立刻慌,因为我给自己定过一条排查顺序。先查边界条件:数组是否可能为空,索引是否越界,循环的起止条件是否正确。再查状态更新:动态规划的转移方程是否漏了状态,滑动窗口的left指针是否在正确位置更新。最后查数据类型:是不是应该用long却用了int,导致大数结果被截断。
这套顺序每面时间不长,但能覆盖绝大多数运行结果错误的原因。如果排查两轮还找不到问题,就果断放弃这道题,转去做后面的题目。笔试时间有限,死磕一道题付出的机会成本太高了。
5.3 遇到完全没思路的题目怎么办
说句实话,第三道编程题如果完全没思路,这种情况真的很常见,我身边不少同学都遇到过。我的策略是先把题目重读一遍,尝试写一个暴力解法,不要把问题想复杂。
比如搜索类题目,哪怕不知道最优算法,也可以先写一个DFS把所有可能性遍历一遍。动态规划状态不知道设什么,那就用递归把所有组合列举出来。暴力解法的得分可能不高,但至少能跑过一部分简单测试用例,比空着强。而且,当你把暴力解法写出来之后,往往会对题目本身有更深的理解,反而更容易想到优化方向。
6. 笔试结束后的复盘与下一步准备
6.1 趁记忆还热,把题目和思路记录下来
交卷之后不要直接关电脑,我强烈建议趁记忆还清晰,把能记住的题目快速记录在备忘录里。不需要写得很完整,重点是题型、考点、自己当时的思路、卡壳点。笔试结束后一两天内,这些记录还有复盘价值,等过了一周再回头看,很多细节早就忘了。
记录题目还有一个隐藏好处:如果后续面试里被问到“你最近做过哪些算法题”,你就能直接从这些记录里挑一个讲得最清楚的案例,把题面、思路、复杂度、踩坑过程完整讲给面试官。这不仅是笔试复盘的延伸,也是面试准备的素材来源。
6.2 通用岗位笔试之后可能面临的面试方向
笔试通过后,下一轮一般是技术面试。通用岗位的技术面通常不会只盯着某一种语言或某一条技术栈,面试官更可能围绕项目经历、算法能力、计算机基础以及你选择的方向展开。
因为我投的是通用岗位,所以我把面试重点就分成了两块:一是项目里的技术难点和取舍,面试官很喜欢问你为什么选这个方案,而不是那个方案;二是基础知识的深挖,他们可能会顺着笔试中的某个考点连续追问。这个过程其实比笔试更需要体系化表达,所以笔试结束后的一周,可以开始整理自己的项目资料并熟悉常规追问套路。
我在备考时的一点点感受是,笔试只是一道门槛,真正决定你能去哪个团队、做什么业务方向的,往往还是面试阶段的表现。笔试没有考到的知识,面试仍然可能考到;笔试里表现出彩的思路,也可以作为面试时的谈资。
秋招这场仗很熬人,笔试作为第一道关卡,心态占了很大比重。如果你现在手里已经收到了类似的笔试通知,别纠结自己能不能全做对,先按本文的思路把基础知识点过一遍,然后抽出两天时间刷一刷滑动窗口、动态规划、DFS、哈希表这些高频题型,稳扎稳打比什么都强。