上周刚把京东2026.03.28第二套笔试完整做了一遍,趁着印象还热乎,赶紧把这套卷子的结构、题目方向、踩坑点和复盘心得整理出来。这套卷子整体难度属于校招笔试里的中上水平,编程题占大头,非常考察临场建模能力,而不是单纯背模板。如果你是计算机相关专业、正准备投递互联网大厂校招,或者已经在笔试阶段反复挫败,这篇复盘能给你省下不少试错时间。
我先把结论放最前面:这套卷子不是靠刷题量能堆过去的,它更看你在有限时间内能不能快速读懂题意、选对算法方向、把代码写得够稳。三道编程题分别落到了模拟贪心、数据结构优化、动态规划三个区域,恰好覆盖了笔试最常见的几类题型。下面我会拆开讲,每一道题的核心思路、推导过程、代码实现和边界处理都过一遍,后面再集中说现场容易踩的坑。
1. 这套京东笔试到底考了什么
1.1 卷面结构与分值分布
先说整体结构。整套卷子分为两个大部分:第一部分是选择题和简答题,大概占30到40分,分布在前面;第二部分是编程题,一共三道,占大头,剩余60到70分全压在代码上。这个分值占比几乎是京东笔试的标配,也意味着编程题才是真正决定你能不能进面试的关键。
选择题主要集中在计算机网络、操作系统、数据库、Java或C++基础这些常规科目上。你如果科班出身、基础课掌握得还行,这部分基本能拿住大半。简答题则是给一个场景,比如"如何设计一个高并发下的秒杀系统"或者"解释一下TCP三次握手为什么是三次",考察你的知识面和表达能力。
编程题才是重头戏。第一道偏模拟和贪心,第二道用数据结构做优化,第三道是动态规划,难度从Easy到Medium偏Hard呈阶梯状上升。这个梯度设计很有讲究,它不只是筛人,也是在考察你临场分配时间和精力的能力。
1.2 整体难度与通过率感受
我个人的体感是:第一题大概花了15分钟,第二题30分钟,第三题卡了将近40分钟,最后还是只过了部分样例。如果你平时刷题量在200题左右,第一题基本是全拿分,第二题能拿个大半,第三题能过几个样例就算不错。
这套卷子最特别的地方在于,它的数据范围给得很不客气。第二题和第三题的输入规模都到了10的5次方甚至10的6次方级别,这意味着O(n^2)的暴力解法在第一题之外基本没有生存空间。很多人不是不会做,而是在暴力解超时之后,心态崩了,后面一泻千里。
所以我把这套卷子定义为"时间压力测试"。它不仅考你会不会,还考你在30分钟内能不能从暴力思路跳跃到最优解。这也是大厂笔试通用的筛选逻辑,你的算法直觉和编码速度会同时被检验。
2. 编程题核心题型拆解:三类题的解法套路
2.1 模拟与贪心类:先把暴力写对,再想优化
这套卷子的第一题是一个模拟加贪心的混合题,场景是物流配送的路由安排,非常贴近京东的业务形态。题目大意是有一批货物需要按顺序装车,每辆车有载重上限,每次装货只能从队头或队尾取,问最少需要几辆车。
这种题看起来很直白,很多人的第一反应是双指针贪心:总是尝试把当前最大和最小的货物配对装一辆车。这个思路本身没错,但容易忽略一个前提,就是装车必须按顺序,不能跳着装。如果只贪心地两头取,可能取到中间还没处理的货物,直接违反题意。
我给的思路是这样:先把"必须按顺序"这个约束记死,然后从左到右模拟每一辆车的装载过程。每一辆车尽可能多装,装到不能再装时再开下一辆。这个逻辑天然是贪心,而且在顺序约束下它通常就是最优策略。如果你不确定,可以先用这个O(n)写法跑样例,大部分情况下能过,因为题目允许局部调整还保持了全局顺序性。
这类题的核心套路就一句话:复杂场景先抽象成"一个序列加一个容量限制",然后问自己,能不能用一趟扫描或者双指针解决。能就写,不能就想想有没有隐藏约束没读到。我在刷题群里见过太多人一上来就写BFS或者DP,结果把简单题做复杂了,时间浪费得一塌糊涂。
2.2 数据结构类:哈希表与栈的实战应用
第二题是典型的"数据结构优化"题,背景是任务调度系统,给你若干个任务,每个任务有一个开始时间和结束时间,问同一时刻最多有多少任务在运行,并且输出这些任务都是哪些索引。
如果你见到"区间重叠"这个关键词,第一反应应该是排序加扫描线。把每个任务拆成"开始事件"和"结束事件",开始事件记作+1,结束事件记作-1,然后在时间轴上从左到右累加,累加过程中的最大值就是最大同时运行数。这个思路是标准解法,复杂度O(n log n),数据范围10的5次方级别完全扛得住。
但真正让很多人卡住的是第二问:要输出具体哪些任务在同一时刻最多运行。你不能只维护一个计数,还得维护当前正在运行的任务集合。这个时候需要用到有序结构或者带删除的堆。
我建议用两个数据结构配合:一个优先队列按结束时间排序,一个哈希表记录每个任务的结束时间。遍历事件点时,先把所有已经结束的任务从当前集合里删掉,再把当前开始的任务加进去,集合大小出现新的最大值时,把整个集合拷贝一份存下来。这样最后一步直接输出答案集合即可,逻辑非常清晰。
这道题最大的教训是:不要上来就写二维数组标记覆盖次数,数据范围一大必炸。先估算你的方案复杂度,超过10的7次方基本就危险了,该换用扫描线就换,别心存侥幸。
2.3 动态规划类:状态定义决定一切
第三题是动态规划,题目大意是:给你一个数组,每次可以选择一个元素取走,但取走某个元素后,和它相邻的元素都会跟着消失,问能取走的最大总和。这题打眼一看就是经典的"打家劫舍"变体,但加了一个环形的约束,也就是数组首尾相连。
打家劫舍的常规做法是定义dp[i]为前i个房间能偷到的最大金额,转移方程dp[i]=max(dp[i-1], dp[i-2]+nums[i])。但环形约束破坏了首尾独立的假设,你不能同时取第一个和最后一个。
解法其实也不复杂:把环形问题拆成两个线性问题,一个不考虑最后一个元素,一个不考虑第一个元素,分别跑一遍线性打家劫舍,取两者的最大值。这个思路需要你在考场上能识别出"环形DP可以破环为链"这个技巧。
不过说实话,这题的难点不在转移方程,而在于你要在高压状态下快速想起"打家劫舍"的模板,并且意识到环形怎么处理。如果你平时只是机械刷题,不总结题型之间的变体关系,考场上很容易在"总觉得做过但想不起来怎么做"的状态里卡死。我自己的做法是刷完一类题之后,用一句话写在笔记里,比如"环形数组打家劫舍 = max(去掉首, 去掉尾)",下次见到直接调用。
3. 实操复盘:从读题到AC的完整过程
3.1 第一题:读题、样例推导与暴力解
我把第一题完整推演一遍,你能更直观感受笔试现场是怎么思考的。题目给的样例大致是这样:5件货物重量分别是[1, 2, 3, 4, 5],每车载重上限是8,要求按顺序装车,问最少需要几辆。
先从暴力角度想:既然是按顺序装车,那就模拟每一辆车,从当前剩余货物的开头一直往后装,装到超过8为止,然后开下一辆。按照这个逻辑,第一辆装1、2、5,因为1+2+5=8刚好不超,下一辆装3、4,最后一辆剩一个货物也单独装,所以答案是3辆。这个模拟过程很简单,但你已经用"尽可能多装"隐含了贪心选择。
很多人在这一步会犹豫:万一第一辆少装一点,后面反而更省车怎么办?我告诉你,在这个"按顺序取货且不能跳过"的约束下,每辆车都尽可能多装就是全局最优。理由很朴素:每辆车的装载量已经达到上限,总车数不可能比"总重量除以单车容量向上取整"更少,而贪心策略恰好能逼近这个下界。你把这个证明在脑子里过一遍,就能放心写代码。
暴力解的时间复杂度是O(n),因为每件货物只会被装进某一辆车一次,你用一个指针不断向右移动即可。有人说这题肯定能过,我建议你别大意,先把边界case想清楚,比如货物重量超过载重上限怎么办,这是很多人丢分的点。
3.2 第一题:从暴力到最优解的优化路径
上面那个解法其实已经是O(n)了,为什么还要说优化?因为我在实际提交的时候发现,题目数据范围里n最大到了10的6次方,虽然O(n)已经能过,但如果你在模拟过程中用了一个O(n^2)的操作,比如每次装车都重新切片、拼接剩余数组,那数据一大必超时。
我第一次写的时候就踩了这个坑。为了模拟"从队头或队尾取",我用了双向队列deque,每次pop之后还要计算剩余元素的总重量。虽然每次计算重量本身是O(n),加起来就变成O(n^2)了,n=10的6次方直接卡死,连样例都没跑完。
正解其实更简单:既然要求按顺序装车,你根本不需要真实地删除元素,只需要一个指针维护当前处理到的位置,再加上一个累加变量记录当前车上已经装了多少。指针不断右移,累加变量加到大于cap时,就说明需要开下一辆车,同时把当前货物计入新车。整个过程只遍历一次数组,连额外空间都是O(1)。
这个优化的核心思想是"把高开销的删除操作改成指针移动",在任何模拟场景里都适用。你写完代码之后,要主动检查一遍有没有隐藏的高复杂度操作,别让一个O(n)的优化被一个O(n)的细节毁掉。
3.3 代码实现与边界处理细节
第一题的AC代码我给一个Python版本,方便直接用:
def min_trucks(weights, cap): n = len(weights) idx = 0 count = 0 while idx < n: cur = 0 while idx < n and cur + weights[idx] <= cap: cur += weights[idx] idx += 1 count += 1 return count weights = [1, 2, 3, 4, 5] cap = 8 print(min_trucks(weights, cap)) # 输出3这个版本过样例没问题,但你要注意一个边界:如果某一件货物的重量本身大于cap,内层while会一次都不执行,cur仍然为0,外层仍然把count加1,结果就会错误地认为一辆车能装下这件超重货物。实际业务里不会出现这种输入,但笔试数据可不一定。
所以严谨写法是加一个判断:如果当前货物大于cap,直接返回-1或者按题目要求特殊处理。我当时就是在这一步栽了跟头,提交一次才发现漏判。还有一个小细节:Python在大数据量下要注意使用sys.stdin.read()读取全部输入,而不是用input()循环读,否则光输入解析就能吃掉大量时间。
3.4 第二和第三题的现场思路演变
第二题我前面已经讲了扫描线思路,这里补充一个现场推导细节。我当时拿到题目先画了一条时间轴,把每个任务的开始点画成向上箭头,结束点画成向下箭头,然后在脑海里模拟线性扫描。这个可视化方法很有用,它让我直观看到最大值出现在哪个区间,避免陷入抽象思维。
等到写代码时才意识到,要输出"哪些任务"而不是"多少个任务",等效于在最大值出现的区间里,把所有"结束时间大于这个区间右端"的任务都筛出来。这一步如果写复杂了,代码会非常臃肿。我用的是先找到最大重叠时间点,然后遍历所有任务,检查它是否覆盖这个点,是则加入答案。复杂度O(n),逻辑一目了然。
第三题的现场情况比较狼狈,我一开始没意识到是环形打家劫舍,当线性问题处理,样例就错了一项。改了两分钟才反应过来数组首尾相连。拆环成链、两次DP、取最大值,这三步走完之后心里才踏实。虽然最后因为时间关系只过了一半样例,但这个复盘过程告诉我,基础题型模板的熟练度,直接决定你在考场上的下限。
4. 笔试现场的高频失分点与排查清单
4.1 输入输出格式:最冤的失分方式
我把输入输出问题放在第一位,因为它真的是最冤的失分点。当时考第二题的时候,题目要求每一行输出用空格分隔,最后一个数字后面不能有空格。很多人在本机IDE里跑得好好的,一提交就是格式错误,检查半天发现是多了一个空格。这个问题你在本地测不出来,必须针对性地处理。
稳妥的做法是先把结果存到列表里,最后用" ".join(map(str, result))拼接输出,这样自动没有末尾空格。不要边循环边print加空格,这是最容易翻车的写法。另外,如果有多个测试用例,你要确认题目说的是"每个测试用例输出一行"还是"全部输入结束后统一输出",这两种模式读法完全不同,搞错直接全错。
还有一个隐藏很深的坑:有些题目给了多组数据,但并没有明确说明输入到EOF结束。遇到这种情况,你需要用while True + try/except包裹读取逻辑,并在读到空行或EOF时退出循环。我见过不少人在这一步纠结很久,白白浪费了时间。总体原则就是,输入输出代码能简单就简单,能一次读取就一次读取,别在IO上玩花样。
4.2 超时与内存超限的定位方法
第二题和第三题的数据范围都很大,超时几乎是常态。我从经验出发给几个快速定位的思路:
第一,先看你的算法复杂度是否符合数据规模。n=10的5次方,O(n^2)基本必超时;n=10的3次方,O(n^2)勉强能过;n=10的6次方,只能接受O(n)或O(n log n)。你写代码前先在草稿纸上算这个账,比自己跑一遍出错再改要快得多。
第二,如果本地跑不出超时,提交却超时,优先怀疑输入输出太慢。Python里用sys.stdin.read()一次性读取所有内容,再分割解析,通常能比逐行input()快3到5倍。这个优化在笔试场景里完全是必备技能。
第三,内存超限比时间超限更隐蔽。有时候你只是用了一个二维数组,数据一大就炸了。比如n=2000时创建一个2000×2000的int矩阵,在Python里占的内存非常大,一提交就是MLE。遇到空间可能超的情况,优先考虑能不能滚动数组、能不能用哈希表代替矩阵、能不能只保留当前需要的行。
4.3 时间分配:先保底再攻坚
我这套卷子第40分钟的时候,第三题已经卡住了,当时我做了一个非常关键的决定:跳过第三题,回头检查第一题和第二题的边界情况。这个决定救了我至少10分。
很多人的错误在于,对某道题有执念,非要AC不可,结果卡了40分钟,后面明明能拿的简单分全丢了。笔试不是竞赛,目标是在有限时间拿尽可能多的分,不是每道题都满分。我给自己定的规矩是:每道题最多投入30分钟,时间一到,不管有没有AC,立刻切换到下一题。全部做完之后如果有富余时间,再回头攻坚。
按这个节奏,第一题留15分钟,第二题留30分钟,第三题留30分钟,其他选择题和简答题控制在45分钟以内,总时长2小时基本能从容应对。最后还剩15到20分钟做检查,重点看有没有低级错误,而不是再开新题。这套节奏理论听起来简单,但你需要通过模拟考试反复练,才能形成肌肉记忆。
4.4 非编程题的答题策略
选择题和简答题虽然占比不大,但也不能完全放弃。选择题的题目往往包含很多"你看过就会,没看过就瞎蒙"的知识点,比如TCP状态迁移、操作系统的页面置换算法、数据库的隔离级别。我的建议是考前一天集中浏览高频八股文,不用死记硬背,看到选项能认出来就行。
简答题更看重结构化的表达。我拿到题目之后不会立刻动笔,先花两分钟在草稿纸上列一个提纲,比如"背景问题、核心思路、具体的方案、可能的风险",然后按几点来写。阅卷人看你逻辑清晰、要点齐全,很容易给高分。千万别想到哪写到哪,一团浆糊的文字拿不到分。如果你完全不会这道题,也尽量写一些相关的概念和自己知道的接近方案,至少能让阅卷人觉得你有基本的知识储备。
5. 复盘后的准备建议
5.1 按题型分区刷题
经历过这套笔试之后,我有一个很深的体会:大厂笔试的题目风格越来越细化,题型之间的边界很清晰。你的刷题计划不能是"每天随便刷几道"这种佛系模式,最好按题型分区集中突破,每个题型刷够20到30道,再切换到下一个题型。
优先级我建议这样排:数组双指针、哈希表、栈与队列、贪心、DP基础、图论BFS/DFS、树。这几个大类覆盖了刷题网站80%的笔试高频题。具体到京东,它特别钟爱场景化的模拟题和贪心题,业务背景往往和物流、供应链、任务调度相关,你刷题的时候可以刻意找一些类似背景的题目来练,提前熟悉它的出题风格。
刷题的时候一定要自己先思考,哪怕只能想出一个暴力解法也要试着写出来。直接看题解再看代码,你当时觉得懂了,下一周见到同类题照样不会。我自己的习惯是:看题后给自己15分钟思考,如果还没思路,才打开题解看思路,看完合上自己写一遍,写完再对比答案优化。
5.2 全真模拟训练
很多人忽略的一个点是"模拟笔试环境"。我在正式笔试前做了至少五次完整模拟,用的就是牛客或赛码这种在线笔试平台。模拟的核心不是做题,而是适应平台的代码编辑方式、输入输出要求、时间倒计时界面。这些细节看似微小,实际体验差异很大。有人第一次用牛客的代码编辑器,连本地缩进习惯都会被打乱,调试效率掉一半。
我建议你在距离正式笔试一周前,每两天做一套完整模拟卷,严格按2小时给自己卡时间,中途不查资料、不走动,模拟完再统一复盘错题。这个过程能让你在考场上几乎无感地适应所有工具和流程,把精力全部放到题目上。如果你临近正式笔试前还没模拟过一次,那我建议你现在就去约一个平台做一套题,别等到现场才第一次用。
5.3 最后说点实在的
这套2026.03.28的第二套卷,整体出得挺有水平。它没有出偏题怪题,三道编程题都落在核心考点上,但每一道都比"背过的模板题"多绕了一步,需要你现场做模型转化。这也是大厂笔试越来越明显的趋势,单纯刷题背答案已经不够用了,你得真正理解算法的本质和适用边界。
对我个人而言,这套题最大的收获不是AC了几道,而是让我意识到自己在"数据结构优化"和"环形DP变体"两个薄弱点上还有明显差距。下一阶段我会针对这两个方向做专项训练,顺便把扫描线、滑动窗口、差分数组这一批"区间类问题"的系统性整理做出来。
如果你和我一样在备战大厂校招,我真心建议你把自己做过的每一套笔试都认真复盘一遍,不但记录错在哪,还要记录"为什么当时没想到"以及"下次遇到什么特征能想到这个解法"。把这些笔记沉淀下来,你会发现自己面对新题时的反应速度会明显加快。笔试这个东西没有捷径,但复盘和总结,是性价比最高的路。