十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

淘天秋招工程岗笔试复盘:算法题与备考策略全解析

淘天秋招工程岗笔试复盘:算法题与备考策略全解析 1. 笔试整体盘点这场考试到底在筛什么人2024年秋招的淘天工程岗第二批笔试我用一句话概括它不是一场考你会多少知识点的考试而是一场压力测试下的编码能力筛选。整个笔试流程走下来给我的感觉是——题目数量不大但每一道题都在逼你思考时间给得不算宽裕尤其是最后两道编程题直接把区分度拉满了。先说几个硬信息笔试采用线上形式通过牛客网平台进行全程需要开摄像头手机扫码作为第二机位监考。总时长大约90分钟题型分两块第一部分是单选题大约10-12道覆盖Java基础、操作系统、计算机网络、数据库等计算机基础知识第二部分是编程题3道难度从LeetCode中等偏简单到困难梯度递增。不同批次可能略有差异但整体框架基本一致。很多同学问我说淘天的工程岗笔试到底看什么站在过来人的角度我认为核心看三点编码基本功扎不扎实能不能又快又对地写出代码、数据结构与算法的应用能力尤其是动态规划和贪心的敏感度、在有限时间内的取舍能力遇到卡住的题敢不敢跳先把能拿的分稳住。这三点本质上也对应了互联网大厂工程岗日常工作中你需要的核心素质——面对复杂业务场景能不能快速抽象出模型、用合适的方案落地、并且保证代码质量。适合看这篇复盘的人有两类一类是正在备战后续批次笔试的2025届同学另一类是准备冲击其他大厂技术岗、想了解国内一线互联网公司笔试真实难度的开发者。我会把这场笔试考察的考点、我回忆出来的典型题目、考场上真实的时间分配策略、以及我踩过的坑和总结的经验逐一拆开讲清楚尽量让你在看完之后对这场笔试以及同类笔试有一个完整的认知地图。2. 题型分布与考察意图深度拆解2.1 选择题不是单纯背八股而是考边界意识笔试第一部分是选择题数量不算多但涉及的面很广。我回忆下来知识点覆盖大概这么几块Java集合类的底层实现与扩容机制、并发编程synchronized和ReentrantLock的区别、volatile的可见性问题、JVM内存区域划分与GC基础策略、TCP三次握手与四次挥手状态迁移、HTTP与HTTPS的区别、MySQL的索引失效场景、Redis的过期策略与内存淘汰机制。举个例子有一道题问的是当HashMap的负载因子设置为0.5时会发生什么变化。如果你只背过默认负载因子是0.75这道题就只能靠蒙。它真正的考察点是负载因子变小时扩容阈值降低哈希表会更早扩容空间浪费更多但冲突概率减少查询效率提高。这就是典型的背八股会做但是容易错的题它考的是你对机制的理解而不是记忆。再比如有一道关于TCP的题给了四个状态迁移的场景让你选出哪一个描述是错误的。这种题的难度不在你知不知道状态名而在于你能不能分辨出FIN_WAIT_1直接变迁到TIME_WAIT和FIN_WAIT_2直接变迁到TIME_WAIT之间的细微差别。前者是错误说法收到对端的ACK后应该进FIN_WAIT_2后者在特定条件下对端也关闭连接是可以成立的。像这种边界场景很多人复习期间根本没注意到。我的建议是准备这类选择题不要抱着我会背面试题集锦就行的心态一定要深入到机制层面。对于Java岗来说集合源码、JVM内存模型、并发工具的实现原理这几个方向是高频区值得反复看。而且注意笔试选择题里可能出现多选虽然我在这场里遇到的是单项多选对漏选的处理规则每家不一样考试前看清楚说明别在上面吃亏。2.2 编程题三道题对应三个能力层次编程题是整个笔试的胜负手一共三道难度递进。第一道题基本是送分题考察基本的编程实现能力比如字符串处理、数组操作用常规思路就能做出来但要注意细节边界。第二道题上升到算法设计层面常见的是动态规划、贪心或者中等难度的数据结构应用题这是大多数人的分水岭。第三道题则明显拔高通常是综合性的算法题涉及复杂的动态规划优化、图论或者高级数据结构只有少数人能完整AC。我判断淘天的出题风格和字节、腾讯这两年的笔试有相似之处——它们并不追求题目场景的花哨包装而是直接给出一个清晰的数学模型让你去解。这实际上更考验读题能力和抽象能力。很多同学在牛客刷题时喜欢挑场景有趣的题做但真实笔试里题目描述往往很朴素反而容易让人忽略某些隐含条件。考场上一定要把题目读三遍再动手。另外编程题支持的语言比较丰富Java、C、Python都可以选但提交环境是牛客的在线OJ用的是标准输入输出。我强烈建议你用自己最熟练的语言去写不要想着这题用Python写起来更短就临时换语言。笔试时间非常宝贵切换语言的代价远比你想象中大。我自己全程用Java写虽然代码量比Python多一些但语法和常用API都在肌肉记忆里反而省时间。2.3 时间分配前松后紧的典型陷阱90分钟做10多道选择题加3道编程题这个节奏看起来不算夸张但实际做起来非常紧凑。根据我的体验和身边同学的反馈比较合理的时间分配方案是这样的选择题控制在20-25分钟内完成不会的题先凭第一感觉填上并标记不要恋战编程题按5分钟读题15分钟编码5分钟自测的标准第一道控制在20分钟内第二道30分钟第三道留20-30分钟。但这里有一个非常关键的考场陷阱前面选择题一旦遇到模糊的题很容易陷进去。我这次考试就遇到一道关于JVM垃圾回收器的题四个选项里有两个我拿不准结果在上面耗了将近8分钟。事后复盘这个时间性价比极低——就算我花更多时间想对了也就多拿一个单选的分但如果压缩了编程题的时间损失的是几十分的大题。所以我的建议是选择题里一旦超过1分钟还没把握立刻标记并进入下一题全部做完后如果有时间再回头想。编程题则要先做会做的如果第三道题看了10分钟还没有任何思路果断回过来检查前两道的边界情况或者把已有思路的代码写完整不要在一棵树上吊死。记住笔试的目标是总分最大化不是单题完美。3. 编程题实录与解题思路完整复盘3.1 第一题滑动窗口求最短覆盖子串中等偏易这道题我记得题干是给定一个字符串s和一个目标字符串t要求在s中找到包含t中所有字符包含重复字符的最短连续子串返回该子串的长度。如果不存在返回-1。这是很经典的滑动窗口题目LeetCode 76题的最小覆盖子串是同一模型。核心思路就是用两个指针维护一个窗口先用右指针扩展窗口直到覆盖t中所有字符然后收缩左指针寻找最短满足条件的窗口。关键在于用两个计数数组或HashMap分别记录t中每个字符的需求量和窗口中每个字符的出现次数再用一个变量记录当前窗口中已满足的字符种类数从而避免每轮都遍历计数数组判断是否覆盖。下面是我在考场上写的Java版本代码import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); String s sc.nextLine(); String t sc.nextLine(); System.out.println(minWindow(s, t)); } public static int minWindow(String s, String t) { int[] need new int[128]; int[] window new int[128]; int count 0; int total 0; for (char c : t.toCharArray()) { need[c]; if (need[c] 1) total; } int left 0, right 0; int ans Integer.MAX_VALUE; while (right s.length()) { char rc s.charAt(right); window[rc]; if (window[rc] need[rc]) { count; } right; while (count total) { ans Math.min(ans, right - left); char lc s.charAt(left); if (window[lc] need[lc]) { count--; } window[lc]--; left; } } return ans Integer.MAX_VALUE ? -1 : ans; } }这道题有一个特别容易错的边界窗口收缩时只有当前左指针字符的出现次数恰好等于需求次数时减少它才会导致覆盖状态被破坏count才需要减一。很多人写的时候用一个简单的window[lc]--; left;然后每轮重新判断是否覆盖逻辑上也能跑通但复杂度退化到O(n * m)在大数据量下会超时。考场上我大概用了12分钟写完并通过了全部测试用例。3.2 第二题带约束的最大价值选择中等第二题是一道动态规划题。题干大意是有n个任务每个任务有一个开始时间、结束时间和价值同一时间只能执行一个任务求能获得的最大总价值。任务数量n的数据范围给的比较大大概是10^5级别开始和结束时间在10^9级别。这道题的本质是加权区间调度问题经典的动态规划模型。思路分两步首先按结束时间对所有任务排序然后定义dp[i]为前i个任务中能获得的最大价值。对于第i个任务有两种选择不选它则dp[i] dp[i-1]选它则dp[i] dp[p] value[i]其中p是结束时间小于等于第i个任务开始时间的任务中下标最大的那个任务。取这两种情况的最大值即可。这里的关键技术点在于要高效地找到p必须用二分查找。Java里可以用Arrays.binarySearch也可以手写二分找到最后一个end[p] start[i]的位置。如果不用二分而是线性往前找p整体复杂度会退化到O(n^2)遇到10^5的数据量基本就超时了。我给的代码实现如下注意我把任务的结束时间、开始时间、价值封装成了二维数组排序后预处理了一个endTime数组用于二分import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int[][] tasks new int[n][3]; // 开始、结束、价值 for (int i 0; i n; i) { tasks[i][0] sc.nextInt(); tasks[i][1] sc.nextInt(); tasks[i][2] sc.nextInt(); } Arrays.sort(tasks, (a, b) - a[1] - b[1]); long[] dp new long[n 1]; int[] ends new int[n 1]; for (int i 1; i n; i) { ends[i] tasks[i - 1][1]; } for (int i 1; i n; i) { int start tasks[i - 1][0]; int value tasks[i - 1][2]; long notTake dp[i - 1]; long take value; int p binarySearch(ends, i - 1, start); take dp[p]; dp[i] Math.max(notTake, take); } System.out.println(dp[n]); } static int binarySearch(int[] ends, int len, int target) { int l 0, r len, ans 0; while (l r) { int mid (l r) / 2; if (ends[mid] target) { ans mid; l mid 1; } else { r mid - 1; } } return ans; } }这道题我考场上花了大概20分钟AC。过程中踩了一个小坑一开始我把dp数组定义成了int类型结果几组测试用例直接溢出最后把dp和take都换成了long才通过。这里提醒大家笔试拿到题目先看一眼数据范围和结果量级凡是涉及累加的题优先用long不要因为省那点内存吃大亏。3.3 第三题图论最大连通分量变体较难第三题是我这场笔试里唯一没有完整AC的题目。题干描述很简洁给定一个有n个节点和m条边的无向图每个节点有一个权值你需要从图中选择一个连通子图使得子图中所有节点权值之和最大输出这个最大和。但有一个额外限制子图中每个节点的度数不能超过kk是输入给定的值。读题之后我的第一反应是这好像是带度数约束的最大权连通子图是一个典型的NP-hard问题但仔细想想题目应该不会在笔试里要求证明NP-hard大概率是有什么特殊性质我没看到或者是数据范围设计得允许某种搜索/剪枝/贪心通过。我复盘时想到可能的思路方向如果n的范围很小比如n 15可以状态压缩枚举所有子集检查连通性和度数约束求最大权值和复杂度O(2^n * n^2)在n15时可以跑。但如果n比较大可能需要用最大生成树或者带权并查集的思路去逼近最优解。我当时推断n应该不大因为题面没有给出明确的解法和经典模型所以尝试了DFS暴力搜索加剪枝但测试用例里有一组n20的大数据我的做法超时了。这道题给我最大的教训是遇到看起来不像常规DP/贪心的题先假设数据范围小尝试暴力搜索但要尽快分析出复杂度不要抱着侥幸心理硬写。如果我在写DFS之前先估算一下最坏情况的计算量可能就会考虑换一种搜索顺序或者加记忆化。另外考场上第三题如果AC不了尽量拿部分分——比如n小于等于15的测试点暴力枚举能过几组是几组比直接放弃强得多。3.4 考场上如何自测和提交稳拿通过率的细节代码写出来是一回事能在OJ上通过是另一回事。这里分享几个我在多次笔试中总结出的自测步骤每一步都能帮你避免无谓的提交失败。先别急着点提交用题目给的示例数据先跑一遍。这一步能发现80%的读题错误和理解偏差。然后自己构造几组边界数据重点测这几个位置输入为空或最小输入、数值为负如果题目允许、重复元素、达到数据范围上限的极端值。对于Java选手特别要注意整数溢出问题许多测试用例的长数据就是专门来卡int溢出的。再说提交时机如果时间和数据量的限制允许尽量先提交一版能AC的基础解法拿到这题的分数后再优化。牛客网不像Codeforces那样有罚时机制一道题可以多次提交以最后一次为准。所以如果第一道题你写了一个O(n^2)但逻辑正确、在小数据下能过的版本直接提交拿分然后继续优化就好。不要因为我觉得这版太笨了而不交万一优化过程中出现bug至少已经有一个保底分数了。标准输入输出的处理也有讲究。Java用Scanner足够但如果你面对的题目数据量级超过10^5推荐用BufferedReader手动解析效率高很多。考场上的OJ环境对语言版本一般有说明Java我记得是JDK 8或11Stream相关的写法是支持的但没必要在笔试里写花哨的lambda或者Stream API简单朴素的for循环最不容易出错。最后就是注意提交时选的编程语言千万别在代码里写了C的语法却选了Java导致编译失败这种低级错误每年都有不少人交学费。4. 备考建议与真实避坑经验4.1 刷题策略别盲目刷量要给题目分类建模我发现很多同学备战笔试存在一个误区就是觉得我数学好、刷了300道题就稳了。但真实情况是大厂笔试的题目数量有限它考的不是你的刷题量而是你有没有形成一套解题方法论。以淘天这次笔试的三道题为例第一道是滑动窗口第二道是加权区间调度DP第三道是图论搜索。如果你在刷题阶段没有建立起看到子串最短包含关系就想到双指针/滑动窗口、看到任务调度最大化就想到排序DP这类条件反射考场上临时推导是很浪费时间的。我的建议是刷题按题型簇来刷而不是按难度来刷。比如用一周时间集中刷滑动窗口家族最小覆盖子串、字符串排列、无重复字符最长子串再花一周集中刷区间调度家族无重叠区间、合并区间、加权区间调度。这样做的好处是你会在短时间内反复接触同一个解题模板形成深刻的模式记忆考场上看到题目描述大脑会自动匹配模板。另外要重视复杂度分析能力。笔试编程题的数据范围通常不是白给的它会直接告诉你应该用O(n)还是O(n log n)还是O(n^2)的解法。如果你每次刷题都只在LeetCode上通过了就结束不认真分析时间和空间复杂度到了笔试看到10^5的数据范围你就很难判断自己写的暴力解法会不会超时。我见过太多同学刷题刷了不少但问他为什么这题不能用两重循环回答不上来这就是刷了个寂寞。4.2 环境与设备别让细节毁掉三个月准备笔试的设备要求看起来很基础但每年都有人栽在这里。提前一天一定要做一次完整的模拟测试牛客网的笔试系统一般有调试设备入口可以测试摄像头、麦克风、屏幕录制是否正常。我这次笔试前半小时突然发现笔记本摄像头驱动出了问题幸好提前发现赶紧换了备用电脑才没有影响考试。网络环境同样关键。笔试期间全程联网如果考试中途断网虽然系统一般有断线重连机制但时间白白流失非常影响心态。我建议用有线网络连接或者至少保证路由器和电脑之间没有太多遮挡物手机热点作为备用方案要提前准备好。考试期间关闭所有不必要的后台应用尤其是会弹通知的聊天软件避免窗口切换导致被判切屏。还有一个小众但重要的点牛客网的编程题提交时代码编辑器默认可能没有自动保存也不一定支持断点续写。如果你的网络波动导致页面刷新已经写的代码可能全部丢失。稳妥的做法是写比较长的代码时每隔几分钟本地备份一份。我自己习惯用本地IDE把代码写好后粘贴到网页编辑器里这样即使网页出问题也能快速恢复。4.3 考中心态遇到没见过的题怎么办这次笔试的第三道题说实话超出了我平时刷题的主战场。考场上我盯着屏幕大概停顿了3分钟脑子里快速闪过各种算法模型都没办法完美适配。那种感觉很不好受但我复盘时意识到关键是要有一个预设的兜底策略来应对这种场面。我的兜底框架是这样首先重新读一遍题目圈出所有数据范围的数字这些数字会告诉你该用什么复杂度的算法然后从最简单的暴力解法开始想代码结构不管复杂度多高先把思路写下来作为保底最后在暴力解法基础上寻找可优化的点——比如把二维枚举改成一维枚举加二分、用HashMap代替数组遍历这种从暴力到优化的递进思路在考场上是最稳妥的。还有一点不要被AC率绑架。如果在考试最后15分钟仍然没有做出第三道题我建议你回头检查前两道题的代码把你觉得已经AC的代码再跑几遍边界用例然后确保所有提交过且通过的代码没有被后续误操作覆盖。保住已经有过的分数比冒进争取新分数更重要。这一条建议是我在多次实战中用真实的分数代价换来的。5. 笔试结束之后链接面试的能力缺口笔试只是秋招长跑的一个节点但你复盘时不能只盯着题目本身更应该思考这场笔试暴露了哪些能力短板因为这些问题在后续的面试中还会反复出现。以淘天工程岗为例笔试和面试的考察点是高度呼应的——笔试里的算法题是数据结构基座面试里的系统设计、项目深挖则是考察你把算法和数据结构应用于复杂业务场景的能力。如果你在笔试中发现自己对二叉树的遍历变体不熟练那么面试前一定要补齐因为这几乎是技术面的必考题。如果笔试的DP题做得很吃力那就要意识到你不仅要会写DP还要能清晰地讲出状态定义、转移方程和为什么这样设计因为面试官会追问到底。阿里的面试风格以追问著称他们不仅看你的答案更看你的思考路径。另外笔试中遇到的时间分配问题在面试里也有对应场景面试官抛出一个开放性问题你需要在几分钟内组织出回答框架。我见过很多同学面试时因为过度纠结某个细节导致整体答题节奏失控这和笔试里死磕一道选择题导致时间不够是同一个毛病。所以在秋招的每个环节你都要训练自己在有限信息下的决策能力——快速判断果断推进时刻记住目标是整体最优而不是单点完美。关于后续准备我建议笔试结束后尽快整理一份错题和卡壳题的知识点清单按薄弱程度排序优先补最影响面试的部分。对于大厂工程岗来说Java并发、JVM、MySQL索引与事务、Redis、消息队列这几个方向几乎一定会出现在一二面中值得投入整块时间系统复习。笔试里那些选择题涉及的知识点本质上就是面试八股文的高频考纲你完全可以以题带面为面试做一轮高效梳理。
返回列表