尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

京东技术通用岗笔试复盘:算法考点与编程题全解析

京东技术通用岗笔试复盘:算法考点与编程题全解析 1. 京东技术通用岗位笔试到底考什么1.1 为什么技术通用岗的笔试值得专门复盘京东每年的秋招笔试都是大批应届生关注的节点尤其是技术通用岗位覆盖的人群非常广前后端、算法、测试、运维乃至部分数据方向的候选人都会投递这个岗位。很多人看到“通用”两个字就以为笔试难度会低一些实际做下来才发现完全不是这么回事。第七批笔试整体难度属于中等偏上题型固定但覆盖面很大如果没有针对性准备很容易在选择题上翻车或者在编程题上卡到时间不够用。这篇文章我想完整复盘一下2023年秋招京东技术通用岗位第七批笔试的各个模块包括具体考了哪些知识点、编程题的核心思路、做题顺序怎么安排、平台有哪些坑以及我踩过之后总结出来的备考建议。如果你准备投京东或者打算投其他大厂的技术通用类岗位这篇复盘应该能帮你少走不少弯路。先说结论京东技术通用岗的笔试核心考察的是三件事——基础知识的广度、编码能力的熟练度、以及限时状态下的抗压能力。其中基础知识的广度主要通过选择题体现编码能力就是三道编程题抗压能力则藏在整场考试的时间管理和心态调整里。接下来我按考试实际流程逐个模块拆开讲。1.2 第七批笔试的整体安排和平台体验第七批笔试安排在秋招中段时间大概是十月上旬左右。从邮件通知到正式开考一般只有三天左右所以收到通知之后建议立刻开始准备不要拖到最后一晚。考试采用的是远程在线笔试没有线下考场全程需要在规定时间内登录笔试平台完成答题。整场考试一共90分钟题量分布是20道选择题加3道编程题。选择题每题分值相对较低但架不住量大错太多会很伤整体分数。编程题则是大头三道题的分值逐题递增第三题的权重最高。而且编程题不只是一个“写代码”的动作还涉及输入输出处理、边界条件考虑、提交后是否通过全部测试用例等因素每一个环节都可能影响最终得分。平台方面京东当时用的是牛客网的笔试系统登录之后会先做一次摄像头环境检测要求开启浏览器摄像头权限同时会录制整个答题过程。这里提醒一句一定提前测试摄像头和麦克风如果浏览器权限没开进入考试后系统会反复弹窗提醒非常分散注意力。笔试过程中屏幕会全程录制还会有后台的切屏检测所以千万不要跳出笔试页面去搜答案一旦被标记为异常轻则提醒重则直接判零分。2. 选择题范围很广但重点集中在这几块2.1 数据结构与算法题基础但容易翻车选择题第一大类就是数据结构与算法大概占6到8道。这个比例在技术通用岗的笔试卷子里属于正常水平考察的内容不超纲基本都是课本上最经典的知识点但命题角度会比较刁钻容易在细节上做文章。链表相关题目是高频考点。比如会考“如何在单链表中删除指定节点且只给到该节点的指针”考察的是经典的“值覆盖删除法”以及“如何判断链表是否有环”这里不仅要知道快慢指针能解决还要清楚时间复杂度是O(n)、空间复杂度是O(1)。树部分重点考察二叉树的性质比如“已知前序遍历和中序遍历求后序遍历”这种题一旦给出递归序列就容易算错建议考前把三种遍历的规律再过一遍。堆和栈的区别也是常客栈是后进先出、堆是一种完全二叉树这种基本概念但如果题目结合内存分配来问很多人就容易混淆堆区与堆数据结构的定义。排序算法几乎是必考的而且往往不是直接问“快排的复杂度是多少”而是给一个几乎排好序的数组问你“这种情况下哪种排序算法效率最高”。答案是插入排序因为接近有序时插入排序的时间复杂度可以退化到O(n)。反过来说快排在基本有序的数组上性能反而变差因为基准值选取不当会导致分区极度不平衡。这一类分析题靠的不仅仅是背复杂度表格而是真正理解每种排序算法在不同数据分布下的表现。哈希表的考点集中在冲突处理和扩容机制。常见的冲突解决有开放定址法、链地址法、再哈希法题目一般会问“在链地址法下查询一个元素的平均时间复杂度”答案是在负载因子合理的情况下接近O(1)最坏情况是O(n)。扩容则常和HashMap的源码结合考比如“当元素数量超过负载因子乘以容量时HashMap会执行什么操作”答案是resize而且扩容后元素位置要么不变要么在原位置加上旧容量。2.2 计算机网络与操作系统死记硬背的比重不小计算机网络在选择题中大概占4到5道重点集中在TCP/IP协议栈、HTTP状态码、DNS解析过程这些常考区域。TCP三次握手和四次挥手的细节基本每年都出现比如会问“TIME_WAIT状态出现在哪一端”“TIME_WAIT持续多久”“为什么需要TIME_WAIT”。答案分别是主动关闭方、2MSL时间、为了保证最后一个ACK能够到达对方同时让足够多的旧数据包在网络上消失。HTTP相关的考察相对贴近工程实际。比如“301和302的区别是什么”301是永久重定向302是临时重定向这在后端接口设计中经常遇到。再比如“HTTPS握手过程中证书验证发生在哪个阶段”答案是TLS握手阶段客户端会先验证服务端证书的合法性和域名匹配性然后才协商对称加密密钥。操作系统这边进程与线程的对比是必考题。重点掌握进程是资源分配的基本单位线程是CPU调度的基本单位同一个进程内的线程共享地址空间、文件描述符、信号处理器等资源但各自拥有独立的栈和寄存器上下文。死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待——也是高频考点而且经常以“下面哪个措施可以破坏死锁的循环等待条件”这种形式出现答案通常是资源有序分配法。内存管理部分虚拟内存和页面置换算法考得最多。LRU算法是重点要理解它的本质是“选择最近最久未使用的页面淘汰”在实现上可以用链表加哈希表做到O(1)复杂度的访问和淘汰。有些题目会给一个访问序列让你手算缺页次数这种题一定要看清页框大小计算时不要漏掉初始装载时的缺页。2.3 数据库与语言细节易错点密集数据库的选择题一般在3道左右核心是SQL语法和索引机制。连表查询的题目建议重点关注inner join、left join、right join的区别尤其是left join时右表有多条匹配记录时左表行会被重复展开这个特性很多人第一次做都会懵。索引部分常考“什么情况下索引会失效”典型场景包括对索引列使用函数或隐式类型转换、使用LIKE时以通配符开头、使用OR连接非索引列条件。编程语言细节题是根据你选择的语言而定的京东的笔试系统允许选择Java、C、Go等主流语言然后针对语言特性出题。Java方向尤其爱考String的不可变性和常量池比如“String s1 new String(abc)创建了几个对象”答案是可能创建两个一个是堆上的String对象一个是常量池中的“abc”字面量。C方向则爱考虚函数表、指针和引用的区别、const的作用位置等。这类题目最大的特点就是“看起来都会选起来总差一个选项”。我的经验是考前把常见题型的易错点整理成清单尤其是一句话就能记住的结论比如“索引最左前缀原则”“主键索引的叶子节点存整行数据普通索引的叶子节点存主键值”考试的时候看到选项能快速定位到正确答案而不是现场推导。3. 编程题三个题目从签到题到拉分题3.1 第一题哈希表的经典应用第一道编程题一般是难度最低的签到题考察的是基础数据结构的直接应用。我们这批考到的题目大概是这样的场景给定一个整数数组和一个目标值要求找出数组中是否存在两个数它们的和等于目标值并输出这两个数的下标。看到这个题目很多人的第一反应是暴力双重循环时间复杂度O(n²)。但笔试系统的测试用例往往包含大规模数据双重循环在数据量超过10万的时候会直接超时。正确的解法是用哈希表把时间复杂度降到O(n)每次遍历到一个元素时先检查目标值减去当前值是否已经在哈希表中如果存在则直接返回这两个下标否则把当前元素的值和下标存入哈希表继续遍历。public int[] twoSum(int[] nums, int target) { MapInteger, Integer map new HashMap(); for (int i 0; i nums.length; i) { int complement target - nums[i]; if (map.containsKey(complement)) { return new int[]{map.get(complement), i}; } map.put(nums[i], i); } return new int[]{-1, -1}; }这道题的易错点有两个。第一哈希表一定要在查找之后再put当前元素否则会出现在数组中只有一个元素且恰好等于target一半时错误地返回同一个下标两次的情况。第二控制台输出的格式要和题目要求完全一致比如要求输出“index1 index2”就不能输出成“index1,index2”笔试系统中的输出比对是非常严格的。3.2 第二题栈与模拟的排队模型第二道编程题的难度上升到中等我们考到的是一个括号匹配变种题给定一个只包含六种字符的字符串字符分别是不同类型的左括号和右括号要求判断这个字符串中的括号是否正确配对同时还要考虑括号的嵌套顺序。这道题的核心数据结构就是栈。遍历字符串遇到左括号时将其压入栈中遇到右括号时弹出栈顶元素并检查是否匹配。关键在于右括号出现时栈是否为空如果为空则说明没有对应的左括号立刻返回不合法遍历结束后还要检查栈是否为空如果不为空则说明存在未闭合的左括号同样判定为不合法。public boolean isValid(String s) { DequeCharacter stack new ArrayDeque(); MapCharacter, Character map new HashMap(); map.put(), (); map.put(], [); map.put(}, {); for (char c : s.toCharArray()) { if (map.containsKey(c)) { if (stack.isEmpty() || stack.pop() ! map.get(c)) { return false; } } else { stack.push(c); } } return stack.isEmpty(); }这道题考察的不只是栈这个数据结构本身还包括代码的鲁棒性。边界条件非常多字符串为空时返回true、输入字符串只有一个字符时返回false、字符串长度是奇数时可以直接返回false。在笔试中即使思路正确只要有一个边界情况没考虑到提交后就会有一个测试用例超时或报错最终影响正确率。3.3 第三题动态规划的状态定义是分水岭第三道题是整场笔试的拉分题也是一道非常标准的动态规划问题。题目大意是给定一个二维网格每个格子中包含一个非负整数现在从网格的左上角出发每次只能向右或向下移动要求找到一条从左上角到右下角的路径使得路径上经过的所有数字之和最小。这是最经典的“最小路径和”问题状态转移方程很直接dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])其中dp[i][j]表示到达格子(i,j)时的最小路径和。需要对第一行和第一列做初始化因为到达这些格子只有一条路径可走。public int minPathSum(int[][] grid) { int m grid.length; int n grid[0].length; int[][] dp new int[m][n]; dp[0][0] grid[0][0]; for (int i 1; i m; i) { dp[i][0] dp[i-1][0] grid[i][0]; } for (int j 1; j n; j) { dp[0][j] dp[0][j-1] grid[0][j]; } for (int i 1; i m; i) { for (int j 1; j n; j) { dp[i][j] grid[i][j] Math.min(dp[i-1][j], dp[i][j-1]); } } return dp[m-1][n-1]; }这里有一个进阶点值得说明在不要求输出路径本身、只要求输出最小路径和的情况下完全可以用一维滚动数组把空间复杂度从O(m×n)优化到O(n)。笔试的测试用例通常不会以空间复杂度作为卡点但如果你在面试中被追问“能不能优化空间”这就是加分项。我在笔试中直接用二维DP求解因为对于在线笔试来说写出清晰正确的解法远比追求极致优化更重要时间有限时不要冒险。动态规划题目的关键在于状态定义和转移方程一旦这两个核心确定代码本身并不复杂。但如果连DP都没想到而是试图通过DFS加回溯去暴力搜索所有路径那在网格稍微大一点的时候就会严重超时这种代价在笔试中几乎没有挽回余地。4. 时间分配和做题顺序的实战经验4.1 倒计时90分钟我建议这样排优先级整场笔试90分钟我做题时的时间分配是选择题控制在40分钟以内编程题第一题大约10分钟第二题大约15分钟第三题大约20分钟最后留5分钟检查提交。实际执行下来第三题的时间略微超出预期最后是靠压缩检查时间才勉强按时提交。这个顺序背后的逻辑是选择题材量虽然大但单题耗时较短而且分值稳定属于“拿分快、投入产出高”的模块。编程题则需要更长的时间去理解题意、设计算法、编写代码和调试所以留出完整的时间块非常关键。如果你一开始就扑在编程题上很可能导致选择题时间不够后面做选择题时心态一急正确率直线下降。有一种更激进的做题顺序是五分钟浏览全部编程题判断难易程度后决定先做哪道。我建议至少把第一道和第二道编程题通读一遍因为即使是同一批次的题目三道题的难度梯度也可能不像预期那样明显万一第二道题比第三道题还难早发现就能早点调整策略。4.2 编程题的提交策略编程题的提交不是“写完代码点了运行就结束”。牛客网的笔试系统里代码编辑界面通常需要自己选择语言类型然后手写完整的输入输出处理包括Scanner的使用和System.out.println的输出。如果在本地IDE习惯了不写输入输出、只写核心函数的话到笔试现场很容易在输入解析上浪费大量时间。我强烈建议考前把牛客网的常见输入输出模板背下来。比如读取一个整数、读取一行字符串、读取以空格分隔的整型数组、读取二维数组这些输入场景在笔试中覆盖了九成以上的题目。把模板提前准备好考场上直接套用可以有效降低编码的心理负担。还有一个非常实用的技巧先把代码写完并运行示例测试用例确认输出和预期一致之后先不要急着提交而是再手动输入两个边界用例验证一下。比如最小路径和问题可以手动测一下单行单列的网格括号匹配可以测一下空字符串和只有左括号的字符串。边界用例验证完毕后再点提交这样可以显著提高一次通过率。5. 平台与答题的坑提前避开能省半小时5.1 浏览器与IDE的兼容问题牛客网笔试平台对浏览器的兼容性总体做得还行但有几类问题经常出现。第一类是摄像头权限无法启用尤其是在Chrome浏览器上如果之前访问过该站点并点了“拒绝”后续需要手动去浏览器设置里重置摄像头权限。第二类是代码编辑器偶尔会出现自动补全异常或格式化失效的情况这种通常是浏览器插件导致的建议考试前退掉所有不相关的浏览器扩展比如翻译插件、广告拦截插件等。还有一些考生习惯在本地IDE写代码编写完成后复制粘贴到笔试平台。这样做本身没问题但要注意本地IDE的缩进格式可能和线上平台不一致尤其是Tab键和空格混用的情况粘贴后代码排版可能乱掉。虽然不影响编译但会影响你后续排查问题的效率。建议在本地IDE中开启“将Tab转换为空格”的选项或者粘贴后手动全选重新格式化一遍。5.2 输入输出的坑在线笔试最常见的输入输出坑有两种。一种是题目要求“输出以空格分隔”而你用了换行或者反过来。另一种是整型溢出问题题目给定的数据范围有时候达到10的9次方甚至更大如果使用int直接参与加法运算结果可能溢出变成负数导致输出错误。判断是否需要用long的方式很简单看数据范围如果最大值相加后超过2的31次方减1就一定要用long。还有一种输入格式的细节需要注意有些题目第一行是测试用例组数T接下来T组数据有些题目则没有任何分组标志直接输入直到文件结束。这两种格式的处理方式完全不同前者需要用循环控制读取次数后者需要用while(hasNext())循环读取。题目描述里一般会写清楚但考场上一紧张就容易忽略建议读题时用笔在草稿纸上把输入格式的先验条件写下来。5.3 本地调试和线上环境的差异本地IDE能编译运行不代表线上平台也能顺利通过。比较典型的差异包括本地用的是Java 11线上平台可能也是Java 8或Java 11基本没有影响但如果你用了比较新的语法特性比如Java 14的switch表达式或者Java 16的record就一定要确认平台支持的版本。另一个常见问题是代码中使用了额外的包或者类比如用到了java.util.stream.Collectors这些都属于标准库一般没问题但如果你在本地依赖了外部第三方库那线上平台肯定无法编译。所以笔试时尽量不要使用任何非JDK原生的类库。6. 给下一届考生的针对性建议6.1 按岗位方向制定复习优先级京东技术通用岗位的笔试虽然不区分具体方向但不同背景的候选人做同一套题体验差异会很大。如果你平时主攻Java后端那么Java语言细节、Spring框架、MySQL索引这类题目就是你的得分点但数据结构里的复杂树形结构、动态规划的题目可能需要额外补强。如果你主攻算法岗那么编程题基本没有压力但计算机网络和操作系统的选择题反而有可能成失分重灾区。我的建议是不要试图把自己变成全才而是先把最高频的考点吃透。具体来说数据结构中的链表、栈、队列、二叉树算法中的排序、二分、双指针、哈希、动态规划网络中的TCP、HTTP操作系统中的进程、线程、内存管理数据库中的SQL和索引这十个板块覆盖了笔试中九成以上的考点。每个板块不需要掌握到极深但核心概念一定要能够快速作答。6.2 刷题质量比数量更重要很多人备考笔试时陷入一个误区觉得刷题越多越好每天疯狂刷几十道题到最后可能连自己做过的题都没消化。以我身边拿到京东offer的同学经验来看他们大多不是刷题量最大的那批人但一定是对错题复盘最认真的那批人。建议采用“三刷”策略第一遍正常做题能AC就快速过第二遍专门总结题型将每道题归入对应的模板比如“这是带权重的区间合并题”“这是状态压缩DP的入门题”第三遍不写代码只看题目描述在脑海里过一遍解法思路和时间复杂度想不出来再回头看题解。这样做过的题目记忆深度远超简单重复刷题。6.3 实战模拟的价值最后一个建议是考前完整模拟一次。不要只做单题练习而是找一个时间段连续90分钟打开牛客网的一套真题严格按照考试流程走一遍。这个模拟过程能帮你发现至少三类问题第一类是时间管理问题做选择题时容易在某道难题上死磕导致后面编程题时间不够第二类是环境问题比如本地IDE代码格式化风格在线上平台不兼容第三类是心理问题遇到不会的题容易慌张一慌就连续出错。模拟完之后针对暴露出的问题逐一调整。我当时模拟之后发现自己选择题耗时过长就把策略调整为“每道选择题不超过2分钟超过就先选一个最可能的答案并标记最后有时间再回来检查”。这个策略在正式笔试中帮我省出了将近10分钟的编程题时间亲测有效。笔试只是秋招中的一环过了笔试之后还有面试面试同样会考察算法和基础知识所以笔试阶段的准备内容不会白费。现在回想起来京东技术通用岗位的第七批笔试不算特别难但它非常考验基础功底的扎实程度和临场时间分配的合理性。希望这篇复盘能帮你少走一些弯路在接下来的笔试中发挥出自己应有的水平。
返回列表