
京东算法岗的笔试向来是个让人又爱又恨的东西。我自己当年准备春招的时候就把这套2019年的题翻来覆去看了好几遍后来帮学弟学妹做模拟也经常拿它当标杆。原因很简单这套试卷不像很多公司那样只考八股文或者纯刷题它在基础算法、机器学习理论、场景应用三个维度上都有涉及而且题目质量在同类笔试题里算比较高的。准备算法岗的同学不管目标是电商、广告还是搜索推荐方向这套题的参考价值都很大值得认真过一遍。我当时拿到这套试卷的第一感觉是它考的东西很“系统”。不是单纯堆几道LeetCode题而是把数据结构、经典算法、机器学习基础、实时计算常见模型全部串在一起考察的是你对整个算法知识体系的掌握程度。所以这篇文章我不打算只给你报答案而是把整套试卷的考点、解题思路、容易踩的坑以及我当时是怎么准备的原原本本拆给你看。1. 京东算法岗笔试试卷的整体拆解与考点分布1.1 笔试卷面构成与三类核心题型先说卷面结构。2019年京东春招算法类试卷整体上可以分成三大块选择题、简答/分析题、编程题。这个结构在当年的互联网大厂里算是比较标准的配置但它有些自己的特色。选择题部分覆盖面非常广从基础的数据结构数组、链表、栈、队列到排序算法、查找算法再到树、图以及概率论和线性代数的基础题都有涉及。这些题看似简单但命题人很会挖坑比如排序算法的稳定性、不同时间复杂度下的最优选择、哈希冲突的几种处理方式的优缺点对比稍不注意就掉进去。简答/分析题部分才是这套试卷真正开始区分度的地方。我当时印象最深的是一道关于KMP算法的题要求写出next数组的计算过程还考了改进后的nextval数组。这类题不光是让你背结论而是要你现场手推一遍考察的是你有没有真正理解这个算法的本质。另外还有一道关于贝叶斯公式和朴素贝叶斯分类的题以及一道场景题考的是在广告点击率预估场景下如何设计特征、选择模型、处理样本不平衡问题。编程题部分一共三道难度梯度拉得比较开。第一道是热身级的字符串处理题考察基本编码能力第二道是经典的动态规划题但包装了一个实际业务场景第三道是图论相关的题涉及最短路径或最小生成树。能完整做出来的人不多但做出来两道的人通常能进面试。1.2 高频考点一栏从热搜词反推命题趋势我后来看了一些平台上的热搜词和讨论帖发现大家对这套试卷的关注点集中在几个关键算法上KMP算法、粒子群算法、机器学习中的KNN和聚类、排序算法、贪心算法、动态规划以及一些偏冷门但会在选择题里出现的概念比如模拟退火、卡尔曼滤波、Rete算法等。这些热搜词其实很能说明问题。粒子群算法和模拟退火这类优化算法在传统机器学习中不算核心但在京东这种有大量供应链、仓储、物流场景的公司里调度优化、路径规划这类问题经常用到元启发式算法所以出现在选择题里并不意外。同样PID算法、卡尔曼滤波这类控制论相关的内容在纯互联网公司的笔试题里极少见到但在京东这种有实体业务、有物流体系的公司里它是真实存在的应用场景。所以准备这类笔试的时候不能只盯着机器学习八股文或者只刷代码题。你要有一个更宽的视野把算法分为“必须能手推代码的”和“理解原理和适用场景即可的”两大类分别投入对应的时间。这也是我反复给身边的人强调的一点大厂算法笔试考的从来不是单一维度的能力而是你对算法知识体系的完整理解。2. 数据结构与基础算法的必考知识点与解题框架2.1 排序算法从稳定性开始就有一半人掉坑排序算法这部分看起来是最基础的但其实选择题里最容易出幺蛾子。京东这套试卷里排序算法的考察方式很有代表性它不会直接问你“快排的时间复杂度是多少”这种送分题而是会给你一个具体的场景让你选择合适的排序算法或者问某种排序算法在特定输入下的表现。比如它考到了堆排序。堆排序在大顶堆的构建过程、调整过程、以及为什么它的时间复杂度稳定在O(n log n) 这几个点上都有命题空间。我当时复习的时候给自己定了一个标准对于比较排序里的每一个算法我必须能做到三件事——手写代码、说明稳定性、准确说出最好/最坏/平均时间复杂度及其触发条件。还有一个容易被忽略的点是排序算法的稳定性。“稳定”这个概念在JDK源码里的TimSort里是有明确要求的在真实业务排序场景中也经常遇到——比如先按成交量排再按上架时间排如果排序不稳定第二轮的排序会把第一轮的结果打乱。所以在试卷里遇到“哪个排序算法是稳定的”这种题绝不能只背结论要理解稳定性的来源。我当时把常用排序算法整理成了一张自己的对照表后来发现这张表在面试里帮了我大忙冒泡排序稳定O(n^2)适合基本有序的短序列实现代价低但几乎没人用插入排序稳定O(n^2)但在近乎有序的输入下可以达到O(n)TimSort的小片段排序就用它归并排序稳定O(n log n)但需要O(n)辅助空间外部排序的基石快速排序不稳定平均O(n log n)最坏O(n^2)但通过随机化选pivot可以避免最坏情况堆排序不稳定O(n log n)原地排序但常数因子大实际跑起来通常比快排慢计数排序/基数排序/桶排序非比较排序可以突破O(n log n)下限但受数据范围约束这套体系在“算法岗笔试”这个场景下特别实用因为试卷考察的从来不是某一个算法的孤立知识点而是你能否在多个算法之间做正确的取舍。我把这几类排序的适用条件写成了场景题自测比如“100万条订单数据按金额从大到小取前100条用什么排序”——答案是堆排序维护一个大小为100的小顶堆O(n log k)而不是全量排序。2.2 KMP算法与字符串匹配next数组必须会手推字符串匹配这个考点在京东这套试卷里出现得很有代表性。它不直接考“KMP算法是什么”而是给出一个具体的模式串p要求手算出它的next数组。我当时看到题目的时候立刻意识到这个考点考察的是真正的理解而不是背模板。next数组的定义是next[i]表示在模式串中当第i位发生失配时应该跳到哪个位置继续匹配。更准确地说next[i]是模式串前i个字符组成的子串中最长相同前后缀的长度。注意这里“前缀”是不包含最后一个字符的“后缀”是不包含第一个字符的而且前后缀不能是同一个子串不能是自身。我当时总结了一套手推next数组的固定流程分享出来给需要的人参考先写出模式串的每个位置i对应的字符计算前i个字符的最长相同前后缀长度这就是next[i]的值注意第0位和第1位通常直接初始化为-1和0如果失配就用next数组跳转直到匹配或回到-1举一个经典的例子模式串“ABABACA”next[0] -1约定next[1] 0因为子串“A”没有真前后缀next[2] 0因为子串“AB”的前后缀没有公共部分next[3] 1因为子串“ABA”的最长相同前后缀是“A”长度1next[4] 2因为子串“ABAB”的最长相同前后缀是“AB”长度2next[5] 3因为子串“ABABA”的最长相同前后缀是“ABA”长度3next[6] 0因为子串“ABABAC”没有相同前后缀这里有一个特别容易错的地方next数组的定义在不同教材里有不同的约定。有的定义是从0开始有的是从1开始有的要求前后缀不能是自身有的没这条限制。所以考试的时候一定要先看题目给的定义再用对应的方式算别套错模板。我用这个例子给好几个学弟学妹讲过几乎每次都会有人在前缀后缀不能重叠成“自身”这个点上栽跟头。再进一步KMP算法里还有优化过的nextval数组它解决的是一个问题当模式串在A处失配时如果跳转到的位置上字符和A相同那这次跳转是无效的会白白浪费一次比较。nextval就是在next数组基础上如果跳转后字符相同就继续递归跳转。这套试卷里有没有考nextval我不太确定但我建议准备的时候还是把nextval的推导一并学会因为很多面试官会在笔试基础上追问这个知识点。2.3 动态规划与贪心笔试编程题的主角京东笔试的编程题动态规划几乎是必考的。这套卷子里那道DP题包装成了一个商品优惠券叠加的场景本质上还是一个背包问题或者说是区间DP问题。这里有个经验大厂的笔试题很少会直接说“这是一个背包问题”它一定会套一层实际的业务故事比如满减、凑单、优惠券组合、资源分配等等。你得学会把业务层的东西剥掉看到底层的数学模型。以经典的0-1背包为例。假设有n件商品每件商品有重量w[i]和价值v[i]背包容量为W问能装下的最大价值。状态转移方程是dp[i][j] max(dp[i-1][j], dp[i-1][j-w[i]] v[i])这里有一个易错点如果是一维滚动数组优化遍历j的时候必须从大到小否则同一个商品会被重复选择就变成完全背包问题了。这个点几乎每年笔试都会有人踩坑。我当时给自己编了一句口诀“01背包倒着走完全背包正着走多重背包二进制拆分。”笔试现场时间紧张这种口诀能帮你快速把思路校准。除了背包最长上升子序列LIS也是一道高频变种题。不要只背O(n^2)的写法要掌握贪心二分优化的O(n log n)写法用tail数组维护当前长度下最小的末尾元素然后对每个新元素做二分查找。这道题在京东这类喜欢考动态规划的公司里出现频率非常高。我建议把朴素DP、优化DP、以及打印出整个序列这三种情况都练一遍。贪心算法在笔试里喜欢以选择题和编程题混合的形式出现。选择题里爱考“以下哪个问题适合用贪心算法求解”编程题里则喜欢考区间调度、活动安排、或者带权区间覆盖的变种。贪心的核心在于证明每一步的局部最优最终能推出全局最优——最常用的是交换论证法和归纳法。这个证明能力笔试的时候可能不直接考但面试的时候一定会追问所以准备的时候要一起练。2.4 图论与搜索Dijkstra、BFS、DFS与堆的配合图论相关的题在京东算法岗笔试里的占分比不算最高但编程题第三题往往就是图论题区分度很大。我拿到的那年考的是一道带权无向图的最短路径问题数据范围不大但要求输出完整路径。这道题考察的核心就是Dijkstra算法以及它的堆优化版本。Dijkstra算法的前提条件是图中不能有负权边时间复杂度是O((VE)logV)这个复杂度就是通过优先队列最小堆实现的。代码实现上有一个细节容易忽略如果某个节点已经被处理过了即已经出过堆且标记为visited那么后续再遇到它的更大距离值时应该直接跳过否则会因为重复入队导致堆里积累大量无效节点在数据量大的时候会超时。另外BFS和DFS这两个基础搜索算法也值得系统复盘。它们不仅仅用于遍历在笔试里经常会和状态压缩、连通分量、拓扑排序、二分图判定等知识点组合起来考。我当时在热搜词里看到了二分图HK算法、Kahn算法、拓扑排序这些都是图论里比较经典的延伸考点。我建议把“BFS求无权图最短路径”“DFS求连通分量”“Kahn求拓扑排序”“并查集判环”这几个基础套路练到条件反射因为图论题很多时候就是这些基础套路的组合变形。最后特别提一下堆这个数据结构它在笔试里的出场率比我预想的高得多。除了Dijkstra需要堆求TopK问题、找中位数问题、合并K个有序链表、小顶堆大顶堆的“双堆”技巧都是高频考点。京东这套卷子里虽然没有直接考双堆但考了堆排序这说明堆相关的知识点是绕不开的。3. 机器学习与深度学习考点从理论到业务场景3.1 传统机器学习KNN、朴素贝叶斯与特征工程对于算法岗来说机器学习部分才是真正拉开差距的地方。京东这套试卷里传统机器学习考了朴素贝叶斯分类、KNN的基本原理以及特征工程相关的内容。这几个知识点选得非常典型都是实际业务中高频使用、但很多应聘者只了解皮毛的算法。朴素贝叶斯的数学基础是贝叶斯定理P(类别|特征) P(特征|类别) * P(类别) / P(特征)在分类时分母对于所有类别都是相同的只需要比较分子大小。这里有个关键假设特征之间相互独立。这个假设在现实中几乎不成立但朴素贝叶斯在文本分类、垃圾邮件过滤等场景下依然表现很好。笔试里常考的陷阱是如果某个特征的P(特征|类别)为0整个乘积就变成0了需要用拉普拉斯平滑来处理。这个细节几乎每次笔试的简答题里都有可能出现。KNN算法考的是“KNN应用的三个方面”这个经典题。我当时在热搜词里看到“knn算法的应用能力包括哪三个方面”正好对应这个考点分类、回归、以及缺失值填补。KNN的思路很简单——找最近的K个样本投票或取均值得到结果但它的优缺点、K值怎么选、距离度量方式怎么选欧氏距离、曼哈顿距离、余弦相似度、特征是否需要标准化这些细节才是笔试真正要考的。特征工程这部分京东考得比较场景化比如在广告点击率预估中如何设计特征答案通常涉及类别特征的one-hot编码、数值特征的离散化和归一化、交叉特征、时间窗口特征等。这里的大坑是直接对稀疏类别特征做one-hot编码后特征维度爆炸样本不平衡问题会加剧需要结合哈希技巧或者embedding降维。笔试不要求你写代码但要求你能把整个方案讲清楚、逻辑自洽。3.2 深度学习的理论基础与经典模型深度学习部分的题目重点集中在反向传播、梯度下降、激活函数、损失函数和常见的网络结构这几个方向。京东这套试卷没有直接让你手推反向传播但选择题里有涉及到梯度消失问题和CNN、RNN的基本结构。我猜这是很多算法岗应聘者的弱项——能跑通框架但对底层的梯度推导不熟。关于梯度消失和梯度爆炸核心原因在于链式法则连乘导致梯度值呈指数级变化。Sigmoid激活函数的导数最大才0.25多层连乘之后梯度就会越来越小导致浅层网络参数无法更新。解决方案有三个方向使用ReLU及其变体激活函数、使用BatchNormalization、以及ResNet的残差连接。这三条在笔试里是标准答案但更好的回答方式是补充“为什么有效”的机制解释——ReLU让导数恒为1残差连接让梯度多了一条恒等映射的通路保住了梯度的传播效率。CNN的结构、池化的作用、参数共享和局部连接的设计思想也是常考知识点。池化层在降维的同时具有一定的平移不变性但会损失位置信息。如果你的岗位方向是搜索推荐那么对embedding的理解必须到位如果是视觉方向那要额外关注卷积核尺寸、感受野这些概念。京东的算法岗细分为很多方向笔试往往以通识题为主面试才会分方向深入。3.3 场景型算法考点聚类、强化学习与控制算法考京东算法岗有一个比较独特的地方它可能会考察一些不那么“互联网”的算法知识。我在热搜词里看到了“粒子群算法原理”“模拟退火算法”“PID算法在CRPS PSU Power的作用”“卡尔曼滤波算法”这些词说实话这些在纯互联网公司的笔试题里几乎不会出现但在京东的试卷里是合理的存在。原因在于京东的业务版图里有大量的物流、仓储、供应链。路径规划问题可能用到粒子群算法或模拟退火推荐排序可能用到PID的思想做流量调控智能硬件相关的业务可能用到卡尔曼滤波做传感器数据融合。所以笔试里出现这些“冷门”考点实际上是这家公司业务特点的真实映射。准备建议是对这类算法不需要掌握完整的数学推导但一定要理解三个东西——这个算法解决什么问题、它的核心思想是什么、它的典型应用场景是什么。以粒子群算法为例核心是模拟鸟群觅食行为每个粒子代表一个候选解通过个体最优和全局最优来更新自己的速度和位置。应用场景包括路径规划、参数优化、神经网络权重初始化等。只要能把这类问题的框架说清楚选择题基本就能拿下。聚类算法在京东的笔试题里出现频率也很高。K-Means、层次聚类、DBSCAN这三个是重点。K-Means的初始中心选择K-Means、K值如何确定肘部法则、对异常值敏感、只能处理凸形簇等问题都需要掌握。DBSCAN的特点是可以发现任意形状的簇而且能自动识别噪声点但参数epsilon和minPts的敏感度比较高。笔试可能会给你一组点让你描述K-Means的迭代过程这种题考察的是“是否真正理解算法在做什么而不是只会调用sklearn”。4. 实战复盘与备考策略笔试现场容易丢分的细节4.1 时间分配与做题顺序的取舍2019年京东春招笔试的时间有限题量不小所以我当时总结了一套做题节奏先快速扫完整张卷子把选择题里有把握的题先做掉拿不准的做标记留到最后再推敲。千万不要在选择题上恋战。编程题部分我会先看三题的难度从最擅长的入手。第一道字符串处理题通常是最简单的先拿到这个分数可以稳定心态第二道动态规划题需要一些时间思考状态定义和转移方程建议留足30到40分钟第三道图论题如果5分钟内没有思路就先跳过把时间留给可以拿分的题。这里有一个技巧笔试的编程题很注重“部分得分”。如果你的算法是O(n^2)而数据范围要求O(n log n)虽然会有超时的测试用例但可以通过部分测试用例拿到部分分数。所以哪怕你的最优解法想不出来也一定要写一个暴力解法把base case和暴力版本先提交上去能拿一分是一分。我在很多模拟笔试里发现大量求职者因为追求完美的解法最后反而一道题都没提交成功这是最可惜的。4.2 我在复习中发现的两个高频失分点第一个失分点是整型溢出。在计算快速幂、动态规划的状态转移、以及一些组合数问题的时候如果题目说要对结果取模一定要在每一步都取模而不是最后才取一次。尤其是在C里int溢出是未定义行为有时候本地跑没问题上了在线评测系统就出错。我当时在准备阶段专门整理了一份“取模安全写法”模板覆盖了加减乘除和快速幂笔试时直接套用省了很多时间。第二个失分点是边界条件处理。二分查找的边界、双指针的初值和终止条件、DP数组的初始化维度这三个地方是我见过的最容易出bug的位置。尤其是二分查找left和right的更新规则稍微弄错一个细节就会陷入死循环。建议在练习的时候统一使用左闭右开或左闭右闭的一种风格不要每次写都不一样。笔试现场越是紧张越依赖平时养成的条件反射所以平时写代码的风格一定要稳定。还有一个容易被忽略的点是输出格式。有的题要求每行输出一个结果有的要求输出以“#”分隔有的要求精确到小数点后四位。这些细节看似不是考点但格式错误会导致编译正确但判分零分每年都有人栽在这里。每道题做完提交前都花5秒钟检查一下输出格式这个习惯非常值钱。4.3 编程题输出与在线评测的避坑建议在线笔试的编程环境和本地IDE有两个主要差异第一输入输出必须严格按照题目要求第二评测系统可能使用不同的编译器版本C代码里最好不要用非标准的语法。我建议平时练习时就使用与笔试平台接近的编译器和环境比如用牛客网的模拟笔试环境做真题尽量不要依赖IDE的自动补全因为笔试平台通常没有代码提示。关于输入输出推荐大家直接使用标准输入输出的模板。比如C选手在main函数开头加一句“ios::sync_with_stdio(false); cin.tie(0); ”这行代码能大幅提高cin的读取速度避免因为输入量过大导致TLE。这个细节看起来微不足道但在需要读入大量数据的时候可能是生死之差。Java选手则建议用BufferedReader和StringTokenizer而不是直接用Scanner。另外如果你用Python写代码一定要在本地测试大数据量下的执行效率。Python在笔试中的主要风险是超时特别是那些需要高复杂度计算的选择题和编程题。一些复杂度卡的比较死的题Python的AC难度更高这时候你可以用Python快速过一遍思路然后用C或Java提交最终版本主打一个多语言协作。不过前提是你对至少两种语言足够熟练不然反而容易出错。5. 这套试卷背后的准备思路与我的个人体感复习这套试卷的过程也是我后来建立自己算法知识体系的过程。我不建议像背八股文一样去准备笔试而是建议以“模块化”的方式整理自己的知识树基础算法字符串、排序、搜索、DP、贪心是一个模块图论与数据结构是一个模块机器学习与深度学习是另一个模块场景应用题单独归成一类。每个模块下面再按“核心原理 经典题 易错点 高频变种”四要素来整理笔记。我自己最后留下的笔记大概有80多页里面最重要的不是题目本身而是每道题旁边的红色标注——错在哪一步、为什么错、下次怎么避免。这套复盘方法比刷多少题都管用因为笔试考察的不是熟练度而是你在限制时间内建立解决方案的能力。错误复盘是最好的成长源头。我当时还有一个习惯就是每隔两三天会挑一个晚上给自己模拟一次完整笔试严格限时中途不看手机、不查资料。用牛客网的在线笔试环境做一套完整的真题做完之后仔细复盘错题。这样做的好处是让身体记住笔试节奏真正上考场的时候不会那么慌。心态这个东西看起来很虚但它对发挥的影响是实实在在的。最后再分享一个关于投递节奏的经验。如果你打算参加春招建议首选自己最想去的公司做“练兵”但千万不要在完全没有笔试经验的时候就去投最心仪的公司。比较好的策略是先投1到2家难度适中、不是第一选择的公司通过真实笔试来检验自己的水平和节奏复盘之后再冲心仪的京东。这套2019年京东春招算法试卷就是非常适合做“中间检测”的一套题——它不偏不怪覆盖全面做一轮下来基本能反映出你的算法根基是否扎实。