ARTICLE DETAIL

资讯详情

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

京东秋招算法岗笔试复盘:题型解析、编程题思路与赛码网避坑指南

京东秋招算法岗笔试复盘:题型解析、编程题思路与赛码网避坑指南 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(), keylambda 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:1n])) # 如果全是负数直接返回最大的那个数 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:1n])) # 业务逻辑... 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; vectorint 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 考场上真正影响结果的三个习惯最后分享三个我在这次笔试和后续笔试中反复验证的考场习惯它们是考前刷题之外的“软实力”。第一个习惯是读题两遍再动手。笔试题目描述有时会故意埋字眼比如“连续子数组”“至少一个元素”“不要求保持原顺序”这些限定词直接影响解法。我见过太多人代码写到一半才发现漏看了条件然后整段推翻重写。宁可读题多花一分钟也不要写错方向白费十五分钟。第二个习惯是先写主流程再补边界。编程题时间紧张时不要一上来就纠结各种边界条件而是先把核心算法逻辑写出来确保主体思路正确再回头处理空输入、全负数、长度为一等特殊情况。第三个习惯是保持稳定的做题心态。秋招笔试一个接一个难免会有“这道题怎么这么难”“前面选择题是不是做崩了”的焦虑情绪。越焦虑越容易在代码里犯低级错误。你要提醒自己大厂笔试通常是按通过率划线的不需要满分只要把该拿的分拿到大概率就能进面试。遇到一时没思路的题先跳过把能做的都做完再回来啃硬骨头。京东这批笔试结束后我最大的体会是算法岗笔试拼的不只是算法水平更是信息整合和细节管理能力。平台怎么用、输入输出怎么写、选择题范围怎么复习、代码怎么提交这些看起来不起眼的信息差可能比多刷一百道题更能直接转换成分数。希望这篇复盘能帮你把前面的坑提前填平笔试场上能安心把真正该拿的分都拿到。
返回列表