京东秋招算法岗笔试复盘:题型解析、编程题思路与赛码网避坑指南
2026/9/1 12:17:59 网站建设 项目流程

2024年秋招京东算法岗第一批笔试,从收到通知到坐到电脑前,我只有三天准备时间。那几天正好被字节、拼多多、微众银行的笔试轮流轰炸,京东这场对我来说几乎是“裸考”。考完当天感觉一般,结果两天后收到一面通知时还挺意外。回过头看,正是因为裸考,反而让我把这场笔试的平台规则、题型分布和代码题思路看得比平时更清楚。这篇文章就以京东算法岗第一批笔试为样本,完整复盘整个考试过程:从时间线、题型结构,到三道编程题的具体解题思路和完整代码,再到赛码网平台那些刷题经验帖很少写但真正影响分数的细节,最后是秋招算法岗通用的备考建议。无论你是接下来要投大厂算法的应届生,还是正在海投秋招的研二大三同学,这篇应该能帮你少踩几个我踩过的坑。

1. 笔试概况:时间线、题型结构与分数权重

1.1 笔试通知和考前准备

京东秋招的笔试是按批次走的,系统会根据投递时间和部门需求安排批次。我投的是算法岗,邮件标题写的是“JD-算法-第1批”,考试时间固定在周末晚上7点到9点,时长120分钟。邮箱里除了考试链接,还附带了一个模拟练习地址。这里有个特别容易被忽略的点:模拟练习链接不是摆设,考场上答题界面的交互逻辑和模拟题是基本一致的,尤其是编程题的“运行样例”和“提交代码”两个按钮,用途完全不同。我当时想着“都是网上做题还能有啥不会”,根本没点模拟链接,结果开考后花了近十分钟才把界面和各按钮关系摸透,白白浪费了宝贵的考试时间。收到这类通知后,第一件事就是进模拟环境,把题面切换、代码编辑器、运行、提交、自动保存状态全部过一遍。这是所有考前准备里性价比最高的一件事,没有之一。

1.2 考试时长与题量构成

这次笔试满分100分,时间120分钟,题型分成三个部分,具体分布如下表:

题型题量单题分值合计
单选题15题左右2分30分
多选题5题左右3分15分
编程题3题难度分层55分

从分值就能看出来,编程题占了半壁江山,这种“代码为王”的权重设计几乎是所有大厂算法岗的统一配置。选择题部分虽然只有45分,但覆盖范围很广,除了传统的数据结构和算法,还会掺进大量机器学习、深度学习、概率统计的内容。如果你平时只刷LeetCode不看机器学习基础,选择题会很吃亏。我这次遇到的多选题里,有两道关于GBDT和XGBoost的差异、一道关于Linux文本处理工具的多选,都是需要记忆底层细节的题,不是靠“感觉”能蒙对的。

1.3 考试界面与切屏监控

这次考试在赛码网进行,浏览器全屏打开,页面右上角有一个倒计时,左侧是题目列表,右侧是题干和答题区域。选择题直接在选项上点选,编程题有独立的代码编辑区,支持C++、Java、Python等主流语言切换。赛码网的监控机制比牛客严格,考试过程中切换浏览器标签页或者跳出全屏两次以上,系统会记录异常行为,严重的会直接交白卷。我当时在本地IDE和浏览器之间来回切换调试代码,虽然最终没有被判作弊,但状态栏弹了两次“切屏警告”,确实会影响心态。建议你提前想好策略:要么直接在赛码网编辑器里写代码,要么用一台副屏设备展示本地IDE,主屏保持考试页面全屏,避免任何不必要的切屏动作。

1.4 做题顺序与时间分配

这次笔试我给自己定的策略是:选择题控制在45分钟之内,给三道编程题留70分钟,最后留5分钟检查提交状态。实际执行下来,选择题花了38分钟,编程题花了一个小时,剩下十几分钟把不确定的多选题又筛了一遍。编程题我做题顺序是:先快速扫一眼三道题,把最简单的题先AC掉,再啃中等题,最后挑战难题。为什么要倒着做而不是按顺序做?因为程序题的前面不一定简单,难题也可能放在第一题来干扰心态。先拿稳分,后面就算时间不够也不至于心里发慌。

2. 选择题复盘:机器学习、深度学习和数据结构的三维考点

2.1 机器学习基础题:从SVM到集成学习

这次笔试的机器学习部分,难度不算深,但考得很细。印象比较深的一道题是给了一个二维平面上的若干样本点,问SVM的间隔边界是多少,支持向量是哪几个。这题考察的是超平面间隔计算,知道点到直线距离公式就能做,但口算容易错,因为样本点的坐标里有一个是分数,需要细心化简。还有一道关于XGBoost和GBDT区别的多选,常见选项包括:XGBoost在目标函数里加了正则项、XGBoost支持近似直方图分裂、XGBoost可以并行建树、GBDT只能用CART。这里面“XGBoost可以并行建树”是需要斟酌的,XGBoost的并行不是树之间的并行,而是特征分裂的并行计算,如果表述不严谨就容易选错。笔试里这类咬文嚼字的选项其实就是筛人的点,复习时不能只背“XGBoost比GBDT快”这种粗结论,要能解释快在哪里。

2.2 深度学习基础题:感受野、激活函数与注意力

深度学习相关的题也出现了好几道。有一道题给了一个三层卷积结构,包括卷积核尺寸、步长、填充,要求计算最后一层特征图的感受野。这道题是典型的“公式+手算”,我用公式:感受野 = 感受野 + (kernel_size - 1) * stride_前置累积,慢慢推出来的。建议备考时把感受野、参数量、FLOPs这几个计算公式熟练掌握,它们经常出现在大厂算法岗笔试里,尤其是涉及CNN结构的岗位。另一道单选问的是ReLU相比Sigmoid的优势,选项给了很多“看似正确但实际错误”的表述,比如“ReLU函数可导性更强”,这是错的,ReLU在0点不可导,它真正的优势是缓解梯度消失、计算简单、稀疏激活。这提醒了我们:深度学习基础复习不能只做调包侠,底层机制要能说清楚。

2.3 数据结构、概率统计与语言细节

数据结构题里考了二叉树前序和中序遍历求后序遍历,还有一道栈模拟题:给出入栈序列,判断哪个出栈序列合法。这些都是经典题,难点不在思路,而在做题速度,尤其是用手推模拟栈时容易乱。建议考前把二叉树遍历的递归和非递归写法、单调栈、滑动窗口等模板题快速过一遍,考场上能省下很多时间。

概率统计部分考了贝叶斯公式的一道应用题,题目背景是用户点击率预测的简化模型:P(转化|点击)和P(点击)以及P(转化)之间的关系,本质上就是条件概率公式。还有一道关于条件熵和信息增益的题,问决策树分裂时选择特征的标准。这些内容属于机器学习的前置知识,即使不做算法岗,开发岗笔试也常考,值得认真看。语言细节方面,我遇到一道C++的题目,考察const修饰指针和引用时的语义差别,以及一道Python字典默认值的“坑”:dict.get(key)dict[key]行为的差异。这类题往往不起眼,但却是拉分项,很多算法很强的人在语言细节上栽了跟头。

3. 三道编程题:题目回溯、思路推导和AC代码

编程题是整场笔试的重头戏。由于赛码网考试结束后题目不会随试卷保留太久,我趁记忆还热乎时把三道题的大意和求解思路完整还原了一遍。三道题分别是字符频率统计、带截止时间的任务调度、环形数组最大子段和,难度梯度比较明显,分别考察基础编码、贪心+优先队列、动态规划进阶。下面按题目逐一拆解。

3.1 第一题:字符频率统计并排序(简单热身题)

题目大意:输入一行只包含小写字母的字符串S,请按字母字典序输出每个出现过的字符及其出现次数,格式为“字母:次数”,每个结果占一行。

示例

输入:jdpractice 输出: a:1 c:1 d:1 e:1 i:1 j:1 p:1 r:1 t:1

这道题的思路非常直接:用一个哈希表统计每个字符出现次数,然后对字母排序输出。代码量很小,我用Python在赛码网编辑器里直接写的:

import sys from collections import Counter def solve(): s = sys.stdin.readline().strip() if not s: return cnt = Counter(s) for ch in sorted(cnt): print(f"{ch}:{cnt[ch]}") if __name__ == "__main__": solve()

这道题唯一的坑是输入字符串可能带有末尾换行和空格,strip()一定不能省。另外,如果题目改成“按照出现次数从大到小输出,次数相同按字符序”,模板就要换成sorted(cnt.items(), key=lambda x: (-x[1], x[0]))。笔试里大概率不会只考一次字符统计,建议把Counter的几种排序写法都备好。这样的热身题如果不能5分钟内AC,说明基础编码手感还没恢复到考前状态,需要多刷一些简单字符串题来找感觉。

3.2 第二题:带截止时间的最大收益任务调度(贪心+优先队列)

题目大意:小明有n个任务,每个任务有两个属性:截止时间d_i,完成可获得的价值v_i。每个任务耗时1个单位时间,时间从0时刻开始。求在不超过各自截止时间的条件下,能获得的最大总价值。

示例

输入: 5 2 3 1 4 3 2 1 1 3 5 输出: 9

这道题我一眼看出来是经典的“任务调度 + 贪心”。先按截止时间从小到大排序,然后用一个小顶堆维护已经选择的任务价值。遍历每个任务时,先将其价值压入堆中,然后检查当前堆的大小是否超过了当前任务的截止时间。如果超过了,说明在截止时间内安排了太多任务,必须从堆中弹出最小的价值,这样才能保证选择的任务集合满足所有截止时间约束。选择价值最大的尽量多保留,最终堆中所有价值之和就是答案。

import sys import heapq def solve(): data = sys.stdin.read().split() if not data: return n = int(data[0]) tasks = [] idx = 1 for _ in range(n): d = int(data[idx]) v = int(data[idx + 1]) idx += 2 tasks.append((d, v)) tasks.sort() # 按截止时间升序 heap = [] for d, v in tasks: heapq.heappush(heap, v) if len(heap) > d: heapq.heappop(heap) print(sum(heap)) if __name__ == "__main__": solve()

这段代码的关键点在于if len(heap) > d这一行。为什么不是直接比较总耗时和截止时间?因为每个任务耗时都是1,堆的大小就是当前安排的任务总数。在时间t时最多只能安排t个任务,所以如果堆中任务数超过当前截止时间d,就必须去掉一个价值最低的任务。这个贪心思路的正确性靠的是“交换论证”:任何可行解都可以在不降低总价值的情况下,调整成这种“按截止时间顺序、优先保留高价值任务”的形式。这道题的复杂度是O(n log n),n如果达到10^5级别,暴力选择任务集合显然会超时,优先队列是标准解法。

3.3 第三题:环形数组的最大子段和(动态规划进阶)

题目大意:给定一个长度为n的环形整数数组,数组可以首尾相连,请找出一个连续子数组,使其元素和最大,返回该最大和。注意子数组至少包含一个元素。

示例

输入: 4 1 -2 3 -2 输出: 3

这道题是经典“最大子段和”的环形变种,在LeetCode上也有原题(918号)。做这题之前,需要先明确一个结论:环形最大子数组和 = max(普通最大子段和, 数组总和 - 最小子段和)。为什么成立?想象一个环,如果你要选择的连续子数组跨越了数组的边界,那它其实就是“整个数组去掉中间一段连续部分”的结果。要去掉的这一段和应该尽可能小,这样才能让剩下的和尽可能大。如果所有数都是负数,这个公式会出问题——比如数组全是负数时,普通最大子段和已经是最大值(选一个最大的负数),而“总和-最小子段和”可能等于0或更大但对应“空子数组”,不符合题目“至少一个元素”的要求。所以需要单独判断。

import sys def max_subarray(nums): cur = 0 best = -10**18 for x in nums: cur = max(x, cur + x) best = max(best, cur) return best def solve(): data = sys.stdin.read().split() if not data: return n = int(data[0]) a = list(map(int, data[1:1+n])) # 如果全是负数,直接返回最大的那个数 if max(a) < 0: print(max(a)) return max_linear = max_subarray(a) # 普通最大子段和 total = sum(a) b = [-x for x in a] # 取反,用来求最小子段和 min_subarray = -max_subarray(b) # 最小子段和 max_circular = total - min_subarray # 总和减去最小子段和 print(max(max_linear, max_circular)) if __name__ == "__main__": solve()

普通最大子段和可以直接用Kadane算法:cur = max(x, cur + x),含义是“要么从当前元素重新开始一段,要么把当前元素接在之前的子数组后面”。在环形场景下,求最小子段和的技巧是把数组每个元素取相反数,再做一次最大子段和,得到的最大值取负就是原来的最小子段和。这样写比自己维护一个“最小子段和”的状态更不容易出错。这道题整体难度中等偏上,如果能快速写出Kadane算法的两个变式,AC问题不大。

3.4 代码题的提交策略

编程题的提交策略也值得单独说。赛码网的编程题编辑器有“运行样例”和“提交代码”两个按钮,许多第一次用的人会把两者搞混,示例通过了就以为提交成功了,考完才发现自己一道题都没提交上。建议每写完一道题,先点击“运行”看示例输出,确认无误后立刻点“提交”,然后进入下一题。最后留出5分钟,回过来检查“已提交”列表,确认三道题都处于“已提交”状态。这个检查动作如果不做,前面所有努力都可能白费。

4. 赛码网平台的真实体验:不解决这些细节,代码再对也白搭

4.1 赛码网与牛客笔试体验的差异

京东这次笔试用的是赛码网,而不是牛客。两个平台在核心功能上差别不大,但细节差异比较明显。赛码网的代码编辑器更“原始”一些,没有牛客那种自动保存和代码补全提示,写起来更像一个在线文本编辑器。它对Python的版本支持是正常的3.x,但有些评测机的Python环境不会预装第三方库,比如numpy、pandas这种库最好不要在笔试里依赖,能只用标准库就只用标准库。还有一点,赛码网判题时对输出格式的要求非常严格:每一行末尾不能有多余空格,最后一行结尾的换行符可加可不加,但行与行之间的空行不能多。很多本地能跑通的代码,交到评测机上判0分,往往就是输出格式的问题。

4.2 输入输出模板:Python和C++分别怎么写

既然平台是赛码网,我建议把常用输入输出模板在考前敲一遍,不要现想。下面是Python和C++的两套模板,足够应对大部分题目。

Python读取不定长数组的经典写法:

import sys def solve(): data = sys.stdin.read().split() if not data: return n = int(data[0]) arr = list(map(int, data[1:1+n])) # 业务逻辑... if __name__ == "__main__": solve()

C++读取标准输入的经典写法:

#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } // 业务逻辑... return 0; }

这里有一个关键点:如果你用C++,第一次提交前一定要加上ios::sync_with_stdio(false); cin.tie(nullptr);,否则大数据量的输入输出可能超时。不少人大厂笔试挂在超时上不是算法复杂度不够,而是输入输出同步流的开销太大。Python那边则尽量用sys.stdin.read().split()一次性读取,不要用input()逐行读,数据量大的时候性能差距很明显。

4.3 本地能跑通、提交判0分的常见原因

我在考场里第一道题就遇到了“本地跑得通,交上去0分”的诡异情况,后来排查出几个典型原因,写在这里供参考:

第一个原因是输出残留调试信息。很多人写代码时喜欢print中间变量来调试,提交时忘了删。本地跑的时候,终端里既有调试信息又有结果,肉眼看着没问题;评测机只比对标准输出,多一行调试信息就会判错。现在我的习惯是:代码里绝不写临时print,调试用断点,或者单独用一个标志位控制调试输出。

第二个原因是数组下标越界。环形数组那题,如果直接用a[i % n]去访问,一不小心就会把下标算错。本地用例小,越界也能跑出“看起来正确”的结果,但在评测机上是未定义行为。尤其是C++,越界访问不会立刻崩溃,可能给你一个诡异的答案。

第三个原因是多测用例循环没退出。有些题目会包含多组测试数据,一直到EOF结束。如果代码只处理了一组就结束,那么第二组数据会被忽略,判0分。我建议所有笔试代码都写成“while (还有输入) 处理一组”的模式,哪怕当前题目只有一组数据,这种写法也不会有副作用。

4.4 中断网或意外刷新怎么办

赛码网的考试是实时计时,如果你中途断网或者浏览器意外刷新,页面会提示重新登录,倒计时不会暂停。好消息是已经提交过的代码有记录,但还在编辑器里没提交的内容可能会丢失。所以我的建议是:每写一版有意义的代码,就立刻点一次“运行”按钮,因为运行过程本身会触发代码保存,相当于给编辑器的未提交草稿做了一个备份。这招在赛码网上实测有效,但对其他平台不一定管用。最稳妥的方式还是分层提交:每道题逻辑写完,不管是不是最终版,先提交一次,后面如果完善了再重新提交。赛码网默认按最后一次提交的版本判分,所以交早交晚差别不大,就怕不交。

5. 秋招算法岗笔试的备考路线和个人排雷建议

5.1 刷题优先级:从高频考点到冷门知识

经历了多家大厂笔试后,我总结出一个算法岗笔试刷题的优先级排序,适合时间有限的同学参考。

高频必考类,必须熟练掌握:

  • 动态规划:背包问题、最长递增子序列、最大子数组、编辑距离、打家劫舍系列
  • 贪心+优先队列:区间调度、任务安排、合并区间
  • 二叉树:遍历、最近公共祖先、层序遍历、对称性判断
  • 字符串:滑窗、双指针、回文串、字符串哈希
  • 图:拓扑排序、最短路径(Dijkstra)、并查集、最小生成树(Kruskal)

中频但容易出现在手撕环节的:

  • 单调栈:接雨水、最大矩形、下一个更大元素
  • 前缀和/差分:二维前缀和、区间操作
  • 二分答案:最大化最小值、最小化最大值
  • 排列组合/位运算:子集、全排列、二进制枚举

低频但出现就是难题的:

  • 线段树、树状数组
  • 数位DP、状态压缩DP
  • 计算几何(凸包、点线关系)
  • 树链剖分、LCA倍增

我的建议是优先把高频类刷到“闭眼能写”的程度。笔试时不是考察你会不会,是考察你能不能快速无错地写出来,手熟比会更重要。

5.2 选择题怎么突击:八股与公式推导的时间分配

如果在时间有限的情况下,很多人的策略是“选择性放弃选择题复习”,把时间全砸在刷题上。这种做法对大厂算法岗笔试来说很吃亏,因为45分的选择题往往决定了你能否进入面试。选择题覆盖的知识点可以分成三个板块:

第一板块是数据结构与算法,这部分和刷题知识重合度高,例如二叉树遍历、快排复杂度、哈希冲突处理方式,平时刷题写代码时顺手就能复习到。

第二板块是机器学习与深度学习,常见考点包括损失函数、梯度下降变体、常见网络结构、注意力机制、训练/验证/测试集划分、过拟合与正则化,以及GBDT、XGBoost、随机森林等集成学习模型的核心差异。复习时可以重点看“模型之间的区别”这种比较型知识,多选和单选都喜欢考。

第三板块是概率统计与数学,常见考点包括条件概率、贝叶斯公式、期望方差计算、常见分布(正态分布、伯努利分布、泊松分布)、大数定律和中心极限定理。这些内容建议考前一周每天花半小时过一遍公式,不要求会推导但要求会套用。

5.3 考场上真正影响结果的三个习惯

最后分享三个我在这次笔试和后续笔试中反复验证的考场习惯,它们是考前刷题之外的“软实力”。

第一个习惯是读题两遍再动手。笔试题目描述有时会故意埋字眼,比如“连续子数组”“至少一个元素”“不要求保持原顺序”,这些限定词直接影响解法。我见过太多人代码写到一半才发现漏看了条件,然后整段推翻重写。宁可读题多花一分钟,也不要写错方向白费十五分钟。

第二个习惯是先写主流程再补边界。编程题时间紧张时,不要一上来就纠结各种边界条件,而是先把核心算法逻辑写出来,确保主体思路正确,再回头处理空输入、全负数、长度为一等特殊情况。

第三个习惯是保持稳定的做题心态。秋招笔试一个接一个,难免会有“这道题怎么这么难”“前面选择题是不是做崩了”的焦虑情绪。越焦虑越容易在代码里犯低级错误。你要提醒自己,大厂笔试通常是按通过率划线的,不需要满分,只要把该拿的分拿到,大概率就能进面试。遇到一时没思路的题,先跳过,把能做的都做完,再回来啃硬骨头。

京东这批笔试结束后,我最大的体会是:算法岗笔试拼的不只是算法水平,更是信息整合和细节管理能力。平台怎么用、输入输出怎么写、选择题范围怎么复习、代码怎么提交,这些看起来不起眼的信息差,可能比多刷一百道题更能直接转换成分数。希望这篇复盘能帮你把前面的坑提前填平,笔试场上能安心把真正该拿的分都拿到。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询