☰
京东2019校招算法笔试考点全解析:从KMP到业务场景题
2026/10/13 11:29:11 网站建设 项目流程

先交代一下背景。我是2019届的毕业生,当年投了京东的算法工程师岗,笔试一轮下来被筛得明明白白,后来又陆续刷了几年校招题,跟不少学弟学妹交流过这套题。现在回头看,京东2019校招算法笔试的题目质量其实很高,不像有些厂子随便出点选择题糊弄人,它既考基本功,又考工程思维,还夹杂着一些"你不踩坑就不知道答案"的细节题。这篇文章我就把这套题掰开揉碎讲一讲,结合那些年大家高频搜索的算法知识点,把考点、解题思路、实战技巧一次说清。无论你是正在准备校招的应届生,还是想查漏补缺的社招选手,这篇都能给你一些参考。

1. 京东2019校招算法工程师笔试的整体画像

1.1 题型结构与考察范围

京东的算法笔试采用的是牛客网系统,整体题量不算特别大,但时间并不宽裕。题型主要分三块:单选选择题、不定项选择题和编程题,部分批次还加了简答题。从考察范围来看,可以分成四个维度:

  • 数据结构与基础算法:数组、链表、树、图、排序、查找、字符串匹配,这部分约占40%。
  • 机器学习与深度学习理论:经典模型、损失函数、优化方法、评价指标,约占30%。
  • 数学基础与概率统计:概率计算、期望、分布、矩阵运算,约占15%。
  • 工程与业务场景题:特征工程、模型调优、推荐/搜索/广告等业务场景的应用分析,约占15%。

这个比例透露了一个信息:京东要的不是"只会调包"的算法工程师,而是基础扎实、能理解模型原理、还能结合实际业务做方案设计的候选人。我当年就栽在业务场景题上,光顾着刷LeetCode,结果一道"如何为京东商城的搜索排序设计特征"直接把我问懵了。

1.2 难度分布与淘汰逻辑

从笔试结果来看,这套题的难度是循序渐进的。选择题部分只要数据结构学得扎实,拿到80%的正确率问题不大。真正的分水岭在编程题和业务场景题上。

编程题的特点我总结为:题干不长,但坑不少。它不会给你一个"请实现快排"这么直白的题目,而是会把算法包装在一个实际的业务场景里。比如有一道题是把商品按销量和评价综合排序,表面看是个排序题,实际上考的是稳定排序和自定义比较器的底层逻辑。如果你直接调Collections.sort,可能连题目真正想考察的"稳定性对结果的影响"都没意识到。

淘汰逻辑也很现实:选择题筛掉基础不牢的,编程题筛掉动手能力不行的,业务题筛掉只会背概念不会应用的。三轮筛选下来,能进面试的人确实不多。

2. 高频考点逐个拆解:从热搜词看命题侧重

2.1 字符串匹配与KMP算法:next数组必须手推

每年的算法笔试基本都绕不开字符串匹配。京东2019的卷子里虽然没有直接出"实现KMP"这种裸题,但选择题里有一道关于next数组计算的题,陷阱设得很深。

题目大概是:模式串p="abacaba",求next数组。很多人背了公式但没理解原理,一算就错。这里我重新推一遍,帮大家把这个知识点彻底搞懂。

KMP的核心是next数组,next[i]的含义是:当模式串第i个字符失配时,模式串应该回退到的位置。因为next数组有多种定义版本,有的表示"最长相等前后缀长度",有的表示"失配时跳转的位置",差一个1,所以做题时一定要看题目给的是哪种定义。

以"abacaba"为例,按经典定义(next[i]表示前i个字符组成的子串的最长相等前后缀长度):

  • next[0] = -1(或0,取决于实现)
  • next[1]:子串"a",没有真前后缀,为0
  • next[2]:子串"ab",前缀"a"和后缀"b"不相等,为0
  • next[3]:子串"aba",前缀"a"和后缀"a"相等,长度为1,为1
  • next[4]:子串"abac",前缀"ab"和后缀"ac"不等,前缀"a"和后缀"c"不等,为0
  • next[5]:子串"abaca",前缀"ab"和后缀"ca"不等,前缀"a"和后缀"a"相等,为1
  • next[6]:子串"abacab",前缀"ab"和后缀"ab"相等,长度为2,为2
  • next[7]:子串"abacaba",前缀"aba"和后缀"aba"相等,长度为3,为3

所以next数组是[-1, 0, 0, 1, 0, 1, 2, 3]。如果你用的是"失配时跳转位置"的定义,就是[0, 1, 1, 2, 1, 2, 3, 4],每个值加1的关系。

注意:不同教材、不同题目对next数组的定义可能不同。做题前先看清楚题目给的是"长度"还是"位置",否则答案直接错一半。

我当时备考时自己写了个KMP的模板,把两种定义都实现了,还专门写注释标注区别。建议你也这么做,不要只背一种。

2.2 排序算法:堆排序和快排是命题重灾区

排序算法在京东的笔试里不只是考"时间复杂度是多少"这种送分题,它更爱考"在不同场景下选哪种排序更合适"这类应用层面问题。

堆排序是高频考点,因为堆这个数据结构本身太常用了。堆排序的核心分为两步:建堆和调整。建堆的时间复杂度是O(n),不是很多人以为的O(nlogn),这一点很多选择题爱考。为什么是O(n)呢?因为最后一层节点不需要下沉,倒数第二层最多下沉1次,倒数第三层最多下沉2次……总的操作次数是n/4 * 1 + n/8 * 2 + n/16 * 3 + ...,求和后收敛于O(n)。

堆排序的C++实现,我推荐直接用标准库的make_heap、push_heap、pop_heap,笔试时间紧,手写堆容易出错。但你要理解底层原理,因为面试会追问。

快速排序的考点在于:最坏情况什么时候发生?答案是当每次划分都极度不平衡时,比如对已经有序的数组做快排且每次选第一个元素作为pivot,时间复杂度退化为O(n^2)。解决办法是三数取中法或者随机选pivot。

另外还有一个容易被忽略的考点:排序的稳定性。京东有一道选择题问"哪种排序算法是稳定的",答案是归并排序、冒泡排序、插入排序。快速排序、堆排序、选择排序都不稳定。这个知识点在业务场景题里也会用上——比如前面提到的商品排序,如果两个商品综合得分相同,你需要保持它们原始的顺序(比如按上架时间),那就要用稳定排序。

2.3 贪心与动态规划:编程题的主旋律

京东2019校招笔试的编程题,我印象中至少有一道是贪心或DP的变种。这类题的特点是可以套模板,但难点在于识别出"这道题应该用DP"。

贪心算法考的是"贪心策略的证明",京东会问"为什么这个策略是对的"。经典例子是区间调度问题:给定一堆区间,选择尽可能多的不重叠区间。贪心策略是按结束时间排序,然后依次选择。为什么不能按开始时间排序?因为可能选到一个开始早但持续时间长的区间,把后面所有区间都挡住了。

动态规划的题,京东爱出"路径类"和"背包类"。路径类的经典题是网格从左上角到右下角的走法数,背包类则倾向于出变种题。比如有一道题的大意是:有n件商品,每件有重量和价值,背包容量为W,但每件商品可以选择"全拿"或"不拿"或"拿一半",问最大价值。这就是0-1背包和分数背包的结合体,考你对两种背包模型的理解是否透彻。

DP的优化也是一个考点。普通二维DP可以优化成一维滚动数组,空间复杂度从O(n*m)降到O(m)。这个技巧在笔试中很有用,因为有的题目会给很大的数据范围,不优化就内存超限。

2.4 图算法与高级算法:冷门但出现即送命

图算法在京东这套题里出现的频率不算高,但只要出现,通常都是用来拉分的。我印象中有两道题涉及图,一道是Dijkstra算法的选择题,另一道是二分图最大匹配的概念题。

Dijkstra算法的考点主要有:为什么不能处理负权边?因为它是贪心策略,每次选出当前距离最小的点,就认为这个点的最短路径已经确定。如果存在负权边,可能后面发现通过一个负权边能让某个已确定点的距离更小,但此时该点已经被标记为"已确定"了,不会更新,就错了。处理负权边要用Bellman-Ford或SPFA。

二分图最大匹配的HK算法(Hopcroft-Karp算法)也出现在热搜词里,但在实际笔试中很少让手写HK,更多是考概念:什么是增广路?匈牙利算法的核心思想是什么?二分图匹配能解决什么问题?比如任务分配问题:若干个任务和若干个工人,每个工人能完成部分任务,怎么分配才能让完成任务的数量最多。

贪心算法、模拟退火、粒子群算法这些智能算法在笔试选择题里也会出现,但考得不深。模拟退火的考点是"接受差解的概率公式",粒子群的考点是"速度和位置更新公式"。这些属于记忆型知识点,考前过一遍就行,不值得花太多时间。

3. 笔试题型实战与解题思路详解

3.1 编程题的通用解题框架

我后来刷了不少大厂的笔试题,发现编程题虽然千变万化,但解题框架是固定的。我总结为四个步骤:理解题意、抽象模型、设计算法、验证边界。

理解题意这个步骤看着简单,其实最考验人。京东的题喜欢用业务场景包装,比如"给出用户在京东的浏览记录和购买记录,预测用户下一次购买的商品品类"。这道题看起来是个机器学习问题,但实际上笔试系统只要求你写出一个简化版的解决方案——可能是基于协同过滤或者频繁项集。你要能识别出出题人真正想要你写的是什么。

抽象模型是最关键的一步。怎么把一个业务问题转化为算法问题?比如"多个快递员要派送多个订单,如何安排路线使总路程最短"——这就是旅行商问题(TSP)的变种。虽然TSP没有多项式解,但题目可能会给一个较小的数据范围,让你用状态压缩DP求解,或者用贪心求近似解。

设计算法时有几个通用技巧值得掌握:

  • 数据范围n <= 20:考虑状态压缩DP或暴力搜索
  • 数据范围n <= 1000:考虑O(n^2)的DP或枚举
  • 数据范围n <= 10^5:考虑O(nlogn)的排序、二分、堆、线段树
  • 数据范围n <= 10^7:考虑O(n)的线性算法
  • 取模问题:注意中间过程可能溢出,用long long或取模运算

验证边界是很多人忽略的步骤。常见的边界情况包括:空输入、只有一个元素、全部相同、全部不同、最大最小值。笔试不给你调试的机会,提交前一定要在脑子里跑几个边界用例。

3.2 经典真题解析:编辑距离与商品排序

我根据记忆和网上流传的版本,还原两道有代表性的题目,给大家拆解一下思路。

题目一:字符串编辑距离(动态规划)

大意是:给定两个字符串s1和s2,允许三种操作:插入一个字符、删除一个字符、替换一个字符,求把s1变成s2的最小操作次数。

这是非常经典的DP题。定义dp[i][j]表示s1的前i个字符变成s2的前j个字符需要的最少操作次数。状态转移分两种情况:

如果s1[i-1] == s2[j-1],则dp[i][j] = dp[i-1][j-1],不需要额外操作。 如果不相等,则有三种方式:

  • 替换:dp[i-1][j-1] + 1
  • 插入:dp[i][j-1] + 1(在s1的第i个位置后插入s2[j-1])
  • 删除:dp[i-1][j] + 1(删除s1[i-1])

取三者最小值。初始化时,dp[0][j] = j(空串变成长度为j的串需要插入j次),dp[i][0] = i(长度为i的串变成空串需要删除i次)。

这个题看起来简单,但它能衍生出很多变种,比如"近似字符串匹配""DNA序列比对"等。京东考过类似但稍有变化的题,所以模板要背熟,更要理解为什么这样转移。

题目二:商品多关键字排序(排序应用)

大意是:有一批商品,每个商品有销量和评分两个属性,要求按评分降序排列,评分相同按销量降序排列,销量还相同按商品ID升序排列。

这个题考的是自定义排序。在C++里可以用std::sort加Lambda表达式:

sort(items.begin(), items.end(), [](const Item& a, const Item& b) { if (a.score != b.score) return a.score > b.score; if (a.sales != b.sales) return a.sales > b.sales; return a.id < b.id; });

坑点在于:std::sort是不稳定排序,如果比较器写得不够严格(比如只比较评分),就可能出现相同评分的商品顺序被打乱。如果要保持原始顺序,应该用std::stable_sort,或者在比较器里加上原始序号作为最后一级比较条件。

这道题能看出来京东对"工程细节"的重视。排序谁都会写,但写出没有bug的比较器、能解释清楚稳定性的区别,才是他们要的水平。

3.3 在线笔试的环境与做题节奏

京东用的在线笔试系统是牛客网的,支持C++、Java、Python等主流语言。但是有几个细节需要注意:

牛客网的系统在C++编译时默认开的是C++14,不是C++17,所以std::optional这种C++17的特性不能用,但Lambda表达式和auto没问题。

输入输出要用标准IO,C++用cin/cout时如果数据量大,需要加ios::sync_with_stdio(false)和cin.tie(nullptr)加速,否则可能超时。Java用BufferedReader而不是Scanner,Python用sys.stdin.readline而不是input()。

做题节奏上,我的建议是:选择题控制在25分钟内完成,不要在一道难题上纠结超过3分钟。编程题先把所有题都读一遍,从最简单的开始做,确保至少AC一道题。有的同学喜欢死磕难题,结果简单的题没时间做,这是最亏的。

4. 机器学习与深度学习:算法工程师的"第二张考卷"

4.1 经典机器学习模型的必考点

京东的算法岗位方向很多:搜索、推荐、广告、风控、供应链、图像、NLP等,但笔试的机器学习题是大同小异的,主要考察通用理论基础。

KNN(K近邻)是高频考点。它的核心考点有三个:K值的选择、距离度量方式、KD树加速。K值太小容易过拟合,K值太大模型过于平滑,一般用交叉验证确定。距离度量常用欧氏距离,但特征维度很高时欧氏距离的意义会减弱,这时候可以用余弦相似度。有一个经典问题:KNN的"K"取奇数还是偶数?如果只有两类,取偶数可能出现平票,所以要取奇数。但如果多分类,奇偶就没那么重要了。

聚类算法出现的频率也很高。K-Means的考点包括:初始中心点怎么选(K-Means++)、K值怎么确定(肘部法则)、什么时候会收敛(质心不再变化)、对离群点敏感的问题。京东还考过一道关于K-Means的推导题:为什么K-Means的损失函数是每个样本到其所属簇中心的距离平方和?

朴素贝叶斯、决策树、逻辑回归这些模型也会考,但主要以概念为主。比如"朴素贝叶斯的朴素体现在哪里?"——假设特征之间相互独立。"逻辑回归的损失函数为什么用交叉熵而不用均方误差?"——因为逻辑回归的预测值是概率,用交叉熵能保证损失函数是凸函数,梯度下降能收敛到全局最优。

4.2 深度学习必备常识

深度学习部分,京东的考题风格偏"应用",没有太多手推公式的题,但概念考察密集。

反向传播是必考项。你要能解释清楚:为什么可以用链式法则?梯度消失是怎么回事?激活函数怎么选?有一道高频题:在深层网络中,如果使用sigmoid激活函数,为什么容易出现梯度消失?答案是因为sigmoid的导数最大值只有0.25,多层连乘后梯度会指数级衰减。

CNN的考点集中在卷积核尺寸、感受野计算、池化层的作用。计算题也比较常见:输入32x32x3的图像,卷积核5x5x3,步长1,padding为2,输出特征图的大小是多少?公式是(W - F + 2P) / S + 1 = (32 - 5 + 4) / 1 + 1 = 32,所以输出是32x32xN,N是卷积核个数。这类题要背熟公式,考试时直接套。

RNN和LSTM在京东的题里出现频率较低,但有一年考过"LSTM中三个门的作用分别是什么"。答案:遗忘门决定丢弃多少历史信息,输入门决定多少新信息写入,输出门决定输出多少当前信息。如果你面试的是NLP方向,这个问题几乎是必考的。

优化器方面,SGD、Momentum、Adam是三个需要重点掌握的名字。高频考点:Adam为什么能自适应学习率?因为它是通过梯度的一阶矩估计和二阶矩估计来调整学习率的。RMSProp和Adam的区别是什么?Adam在RMSProp的基础上加了动量项。

4.3 特征工程与业务场景题

业务场景题是京东笔试的特色,也是最容易丢分的部分。这类题没有标准答案,考察的是你"面对一个实际问题,能不能提出合理的解决方案"。

我印象最深的一道题是:设计一个商品推荐的召回和排序方案。这道题看似简单,但实际上要把整个推荐链路说清楚:召回阶段用协同过滤或向量召回,排序阶段用LR或GBDT,最后要加一些规则(如去重、多样性控制、新鲜度优先)。你不需要把每个模型细节都写出来,但要把"为什么这样做"讲明白。

特征工程也是一个常考的点。有一道题是"在京东商城中,如何用特征工程提升商品点击率预测的准确率"。这类题的答题思路是分维度回答:

  • 商品维度特征:价格、品牌、类目、历史点击率、销量
  • 用户维度特征:年龄、性别、购买力、历史行为序列
  • 交互维度特征:用户与商品类目的历史交互、浏览时长
  • 上下文特征:时间、季节、是否大促

另外要补充一句,特征工程的核心不是堆更多特征,而是理解业务逻辑,找到真正有区分度的特征。如果笔试时间够,可以简单提一下特征交叉和特征选择方法。

5. 备考策略与踩坑经验

5.1 我的时间分配建议

考研式地准备笔试是不可取的,算法岗位的笔试更考验"长期积累+短期冲刺"。我建议提前3个月开始准备,时间分配大致是:

  • 第1个月:刷完数据结构与算法的基础题,重点掌握链表、树、排序、二分、DP模板
  • 第2个月:刷LeetCode热门题和历届大厂真题,每天2-3道,保持手感
  • 第3个月:重点复习机器学习和深度学习的理论基础,做几套完整的模拟卷

最后两周进入冲刺状态,每天一套模拟题,严格按照考试时间来。模拟题不一定要找京东的,任何大厂的真题都可以。关键是训练自己在有时间压力的情况下答题的状态。

5.2 刷题清单:从LeetCode到企业真题

LeetCode的刷题顺序我建议遵循"由易到难、按专题推进"的原则:

  • 数组与哈希表:两数之和、三数之和、最长连续序列
  • 链表:反转链表、合并有序链表、环形链表
  • 树:二叉树的中序遍历、最大深度、最近公共祖先
  • 回溯:全排列、组合总和、N皇后
  • 动态规划:爬楼梯、打家劫舍、最长递增子序列、0-1背包
  • 图:岛屿数量、课程表(拓扑排序)、网络延迟时间(Dijkstra)

企业真题方面,除了京东,还可以刷腾讯、阿里、字节的历年笔试。这几个大厂的题型相似度很高,但各有侧重:字节更爱考动态规划和DFS/BFS,腾讯偏重基础数据结构和字符串,阿里的题有很强的业务包装风格,京东则介于腾讯和阿里之间。

5.3 容易被忽视的细节:竞赛技巧与代码规范

最后分享几个容易被忽视的细节。第一个是"空间换时间"思路。笔试的评测系统通常内存限制是256MB或512MB,空间一般不会成为瓶颈。所以能用哈希表就先查哈希表,不要老想着怎么省内存。一道题如果时间超时,首先要考虑的是能不能用一个字典把O(n)的查找变成O(1)。

第二个是"暴力解法保底"的思路。很多编程题,即使你一时想不出最优解,也要先把暴力解写上。因为笔试按部分得分,暴力解通常能过30%-50%的测试用例,得一半分也比空着强。我当时有个习惯:先写暴力解提交一遍,确认能跑通部分用例后,再优化成更优的算法。这能保证你已经拿到的分数不会丢。

第三个是代码规范。笔试阅卷分两块:机器跑测试用例和人工看代码。如果你的代码风格清晰、变量命名有意义、关键步骤有注释,人工阅卷的得分会更高。有的同学写得又乱又长,机器跑过了但人工给了低分,这就太冤了。

第四个是做题前先写伪代码。我见过太多同学上来就写代码,写到一半发现思路错了,只能全部删掉重写。正确的做法是:先在草稿纸上写下算法的关键步骤,比如"排序 -> 双指针 -> 去重",确认无误后再写代码。写代码的时候也要按照"定义变量 -> 处理边界 -> 主逻辑 -> 返回结果"的顺序来,逻辑清晰,出错概率低。

5.4 考后复盘:比刷题更重要的事

笔试结束后,不要只关心自己过没过,一定要做复盘。我每次考完都会把题目记下来,哪怕做错或没做出来的题,也要查资料、看别人的解题思路,彻底搞懂为止。

复盘时特别注意四件事:这道题考的是哪个知识点;我的思路在哪里卡住了;最优解为什么比我想到的解法好;还有没有类似的题可以一起整理。把这些总结在一个笔记里,考前翻一遍,比盲目刷题效率高得多。我当年就是把每次笔试的错题和考点整理成了一个"错题本",面试前狂翻,帮了大忙。

6. 写在最后的一点真实体会

回头看京东2019校招这套笔试题,它其实透露出一个明确的信号:基础扎实、思维灵活、工程落地能力强的人才是他们要的。所谓"基础扎实",是指数据结构、算法、机器学习理论的功底;"思维灵活"是指能把学过的知识应用到没见过的场景里;"工程落地"则是说你能写出可以运行、效率还不错的代码。

我后来在面试候选人的时候,也喜欢问笔试中类似的题。一个很有意思的现象是:很多候选人LeetCode刷了三四百道,但让他手写一个稳定的排序比较器却写不出来;让他解释KMP的next数组为什么那样求也解释不清楚。这说明刷题的数量不等于理解的程度。如果你正在准备校招,我真心建议你少刷一点题,多花点时间把每个知识点的原理弄清楚,把每道做过的题吃透,效果会好很多。

备考的过程中难免有焦虑和挫败感,这都很正常。我当年第一次做京东的笔试模拟题,选择题错了一半,编程题一道都没AC,心态差点崩了。后来静下心来,把错题一道一道查资料、写代码、跑通,第二次模拟就好了很多。笔试这个东西,一次失败不代表什么,你需要的只是多练几次,找到感觉。祝你们都能拿到心仪的Offer。

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

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

立即咨询