ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

京东2019校招算法笔试考点全解析:从KMP到业务场景题

京东2019校招算法笔试考点全解析:从KMP到业务场景题 先交代一下背景。我是2019届的毕业生当年投了京东的算法工程师岗笔试一轮下来被筛得明明白白后来又陆续刷了几年校招题跟不少学弟学妹交流过这套题。现在回头看京东2019校招算法笔试的题目质量其实很高不像有些厂子随便出点选择题糊弄人它既考基本功又考工程思维还夹杂着一些你不踩坑就不知道答案的细节题。这篇文章我就把这套题掰开揉碎讲一讲结合那些年大家高频搜索的算法知识点把考点、解题思路、实战技巧一次说清。无论你是正在准备校招的应届生还是想查漏补缺的社招选手这篇都能给你一些参考。1. 京东2019校招算法工程师笔试的整体画像1.1 题型结构与考察范围京东的算法笔试采用的是牛客网系统整体题量不算特别大但时间并不宽裕。题型主要分三块单选选择题、不定项选择题和编程题部分批次还加了简答题。从考察范围来看可以分成四个维度数据结构与基础算法数组、链表、树、图、排序、查找、字符串匹配这部分约占40%。机器学习与深度学习理论经典模型、损失函数、优化方法、评价指标约占30%。数学基础与概率统计概率计算、期望、分布、矩阵运算约占15%。工程与业务场景题特征工程、模型调优、推荐/搜索/广告等业务场景的应用分析约占15%。这个比例透露了一个信息京东要的不是只会调包的算法工程师而是基础扎实、能理解模型原理、还能结合实际业务做方案设计的候选人。我当年就栽在业务场景题上光顾着刷LeetCode结果一道如何为京东商城的搜索排序设计特征直接把我问懵了。1.2 难度分布与淘汰逻辑从笔试结果来看这套题的难度是循序渐进的。选择题部分只要数据结构学得扎实拿到80%的正确率问题不大。真正的分水岭在编程题和业务场景题上。编程题的特点我总结为题干不长但坑不少。它不会给你一个请实现快排这么直白的题目而是会把算法包装在一个实际的业务场景里。比如有一道题是把商品按销量和评价综合排序表面看是个排序题实际上考的是稳定排序和自定义比较器的底层逻辑。如果你直接调Collections.sort可能连题目真正想考察的稳定性对结果的影响都没意识到。淘汰逻辑也很现实选择题筛掉基础不牢的编程题筛掉动手能力不行的业务题筛掉只会背概念不会应用的。三轮筛选下来能进面试的人确实不多。2. 高频考点逐个拆解从热搜词看命题侧重2.1 字符串匹配与KMP算法next数组必须手推每年的算法笔试基本都绕不开字符串匹配。京东2019的卷子里虽然没有直接出实现KMP这种裸题但选择题里有一道关于next数组计算的题陷阱设得很深。题目大概是模式串pabacaba求next数组。很多人背了公式但没理解原理一算就错。这里我重新推一遍帮大家把这个知识点彻底搞懂。KMP的核心是next数组next[i]的含义是当模式串第i个字符失配时模式串应该回退到的位置。因为next数组有多种定义版本有的表示最长相等前后缀长度有的表示失配时跳转的位置差一个1所以做题时一定要看题目给的是哪种定义。以abacaba为例按经典定义next[i]表示前i个字符组成的子串的最长相等前后缀长度next[0] -1或0取决于实现next[1]子串a没有真前后缀为0next[2]子串ab前缀a和后缀b不相等为0next[3]子串aba前缀a和后缀a相等长度为1为1next[4]子串abac前缀ab和后缀ac不等前缀a和后缀c不等为0next[5]子串abaca前缀ab和后缀ca不等前缀a和后缀a相等为1next[6]子串abacab前缀ab和后缀ab相等长度为2为2next[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编译时默认开的是C14不是C17所以std::optional这种C17的特性不能用但Lambda表达式和auto没问题。输入输出要用标准IOC用cin/cout时如果数据量大需要加ios::sync_with_stdio(false)和cin.tie(nullptr)加速否则可能超时。Java用BufferedReader而不是ScannerPython用sys.stdin.readline而不是input()。做题节奏上我的建议是选择题控制在25分钟内完成不要在一道难题上纠结超过3分钟。编程题先把所有题都读一遍从最简单的开始做确保至少AC一道题。有的同学喜欢死磕难题结果简单的题没时间做这是最亏的。4. 机器学习与深度学习算法工程师的第二张考卷4.1 经典机器学习模型的必考点京东的算法岗位方向很多搜索、推荐、广告、风控、供应链、图像、NLP等但笔试的机器学习题是大同小异的主要考察通用理论基础。KNNK近邻是高频考点。它的核心考点有三个K值的选择、距离度量方式、KD树加速。K值太小容易过拟合K值太大模型过于平滑一般用交叉验证确定。距离度量常用欧氏距离但特征维度很高时欧氏距离的意义会减弱这时候可以用余弦相似度。有一个经典问题KNN的K取奇数还是偶数如果只有两类取偶数可能出现平票所以要取奇数。但如果多分类奇偶就没那么重要了。聚类算法出现的频率也很高。K-Means的考点包括初始中心点怎么选K-Means、K值怎么确定肘部法则、什么时候会收敛质心不再变化、对离群点敏感的问题。京东还考过一道关于K-Means的推导题为什么K-Means的损失函数是每个样本到其所属簇中心的距离平方和朴素贝叶斯、决策树、逻辑回归这些模型也会考但主要以概念为主。比如朴素贝叶斯的朴素体现在哪里——假设特征之间相互独立。逻辑回归的损失函数为什么用交叉熵而不用均方误差——因为逻辑回归的预测值是概率用交叉熵能保证损失函数是凸函数梯度下降能收敛到全局最优。4.2 深度学习必备常识深度学习部分京东的考题风格偏应用没有太多手推公式的题但概念考察密集。反向传播是必考项。你要能解释清楚为什么可以用链式法则梯度消失是怎么回事激活函数怎么选有一道高频题在深层网络中如果使用sigmoid激活函数为什么容易出现梯度消失答案是因为sigmoid的导数最大值只有0.25多层连乘后梯度会指数级衰减。CNN的考点集中在卷积核尺寸、感受野计算、池化层的作用。计算题也比较常见输入32x32x3的图像卷积核5x5x3步长1padding为2输出特征图的大小是多少公式是(W - F 2P) / S 1 (32 - 5 4) / 1 1 32所以输出是32x32xNN是卷积核个数。这类题要背熟公式考试时直接套。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。
返回列表