淘天集团研发岗笔试复盘:题型考点与备考思路 2024年这波春招我印象最深的就是淘天集团的研发岗笔试。不是难度高到离谱而是考察范围特别杂选择题、多选题、编程题、设计题全部塞进一场120分钟的线上考试里节奏稍微没控制好就容易翻车。这篇文章不给你“包过”的幻觉而是把我实际遇到的题型、考点还有复盘后的备考思路完整写下来给准备走研发岗校招或实习的朋友做一个真实参考。1. 线上笔试的整体流程与题量概览1.1 笔试平台与考试环境淘天今年用的是牛客网的线上笔试系统技术上和大多数互联网公司校招统一笔试差不多。整场考试需要电脑端进入同时手机扫码开启第二机位并且要求全程开启屏幕录制和麦克风权限切屏次数超过三次会直接标记为作弊嫌疑。我考试时把所有聊天软件、浏览器插件全部退掉只留一个IDE避免误触切屏。这里提醒一句如果用的是公司Wi-Fi或校园网尽量提前测一下网速和稳定性笔试中途断网一次就有可能自动交卷这种低级失误真的会让人心态崩。编程题的答题环境是ACM模式不是LeetCode那种函数补全模式。也就是说题目会给你一段完整的输入样例和输出样例你需要自己写Main类和main函数自己处理标准输入输出。语言可选Java、C、Python等主流语言我选了Java因为淘天技术栈以Java为主笔试后如果进入面试用Java写过的代码也能直接拿来讲减少转换成本。1.2 题型分布与分值占比整场考试总时长120分钟题量大概是10道单选、5道多选、3道编程题和1道设计/问答大题不同批次可能略有差异。我参加的那场分值分布大致如下题型数量单题分值总分占比难度感受单选题102分20%中等偏基础多选题53分15%容易漏选编程题315/20/20分55%区分度大设计/问答110分10%拼思路从分值就能看出来编程题是绝对大头三道题总共55%的占比决定你能不能过笔试的关键就在这。但也不能完全放弃选择题因为很多候选人编程题只能A掉一道半剩下要靠选择题的准确率拉分。尤其是多选题漏选、错选都不得分很多我以为稳的题最后都是因为少选一个选项白白丢了分。2. 编程题算法思路比背模板更能拿分编程题是整个笔试里最值得花时间复盘的部分。先说结论淘天考算法不追求“偏难怪”反而很看重基础算法在实际业务场景里的变通。三道题基本是递进难度第一道送分第二道是动态规划或贪心第三道会带上数据结构与图论。2.1 第一道题字符串处理与模拟我遇到的第一道题考的是字符串处理。大意是输入一个由商品ID和数量组成的字符串要求按某种规则重新排序。比如给定一组“商品编号-数量”的映射要求将数量最多的商品排在最前数量相同则按编号字典序升序输出。这类题本身不复杂但坑在输入格式上可能一行多组数据也可能逗号或分号分割。我当时的核心思路是先按分隔符拆分字符串存进HashMap统计数量再把entrySet转成List用自定义Comparator排序。关键代码如下MapString, Integer map new HashMap(); // 假设输入格式是 A-3,B-1,A-2 String[] items input.split(,); for (String item : items) { String[] kv item.split(-); String id kv[0]; int cnt Integer.parseInt(kv[1]); map.merge(id, cnt, Integer::sum); } ListMap.EntryString, Integer list new ArrayList(map.entrySet()); list.sort((e1, e2) - { if (!e1.getValue().equals(e2.getValue())) { return e2.getValue() - e1.getValue(); // 数量降序 } return e1.getKey().compareTo(e2.getKey()); // 编号升序 }); for (Map.EntryString, Integer entry : list) { System.out.println(entry.getKey() - entry.getValue()); }这种题只要30秒想清楚思路10分钟写完千万不能出错。我复盘时发现如果平时喜欢用Python的Counter写题到了Java笔试环境可能会卡在HashMap.merge这个方法上所以多熟悉Java集合的基本API比背冷门模板更实在。2.2 第二道题动态规划要看清状态定义第二道题是典型的动态规划我记得大致背景是“仓库里有n个包裹每个包裹有一个处理耗时和收益工人连续处理时会产生额外疲劳损耗问如何选择包裹让总收益最大”。题目包装了电商仓库的场景但本质上是带约束的选择问题。我一开始想用贪心按“单位时间收益”排序结果本地自测发现有个用例过不了。于是立刻切换思路意识到题目有一个隐藏条件如果连续处理两个包裹第二个包裹的收益会打折相当于多了一个“是否休息”的决策维度。这就是二维DP。状态定义是dp[i][0]表示处理完前 i 个包裹且第 i 个包裹不处理时能获得的最大收益dp[i][1]表示处理完前 i 个包裹且第 i 个包裹处理时能获得的最大收益转移方程也很直观dp[i][0] Math.max(dp[i - 1][0], dp[i - 1][1]); dp[i][1] Math.max(dp[i - 1][0] value[i], dp[i - 1][1] discount(value[i]));这里discount是连续处理时收益衰减后的值。我花了十几分钟才把衰减规则读明白题目里说的是“如果上一个包裹也处理了则当前包裹收益乘0.8”并不是整个序列统一打折。所以笔试时遇到动态规划不要急着写代码。先把题目里的“决策变量”找出来再定义状态最后推导转移。很多人不是不会DP而是被冗长的业务背景绕晕了。我平时刷题很少看长题干这次吃了亏建议平时练习时多读几道LeetCode上的中文长题干题训练从场景中抽象模型的能力。2.3 第三道题图论与拓扑排序第三道题是“依赖关系排序”大概是说有一组服务调用链每个服务可能依赖其他服务需要输出一个合法的构建顺序。这属于经典的拓扑排序。看到这道题时我第一反应是直接用邻接表存图再算每个节点的入度用队列做BFS拓扑排序。关键代码大概是ListInteger[] graph new ArrayList[n]; int[] indegree new int[n]; for (int[] edge : edges) { graph[edge[0]].add(edge[1]); indegree[edge[1]]; } QueueInteger queue new LinkedList(); for (int i 0; i n; i) { if (indegree[i] 0) { queue.offer(i); } } ListInteger result new ArrayList(); while (!queue.isEmpty()) { int cur queue.poll(); result.add(cur); for (int next : graph[cur]) { indegree[next]--; if (indegree[next] 0) { queue.offer(next); } } }这道题真正的坑不在拓扑排序本身而在“如果存在多个可行的构建顺序输出字典序最小的那个”。此时队列要换成最小堆也就是PriorityQueue然后每次取出入度为0且编号最小的节点。我当时就漏了“字典序最小”这个条件前20分钟写出的代码自测通过但提交后只能过部分用例最后才把队列改成优先队列。所以笔试中的图论题往往不是裸算法而是加了输出限制、边界条件或业务语义。敲代码前把题目里的限制词圈出来比如“字典序最小”、“最多可以跳过几个节点”等能省下大量调试时间。3. 计算机基础选择题八股文里藏着的高频考点编程题之外选择题占了35%的分值覆盖面很广。考前很多人说“八股文背了就行”但实际做下来每道题都不是单纯的背诵而是给你一段代码或线上日志要你判断输出或定位问题。我挑了印象最深的三块来复盘。3.1 Java集合与并发Java集合考得很细。有一道题是问HashMap在JDK 7和JDK 8中插入元素时链表转红黑树的阈值是多少以及为什么是8。这个数字大部分人都知道但题目还追问了“当容量小于64时即使链表长度达到8也会做什么操作”答案是先扩容而不是转红黑树。如果只是背结论很容易漏选。并发部分考了ConcurrentHashMap在JDK 8中的实现变化比如抛弃了分段锁改用CAS加synchronized锁住链表头结点。还有一道题问volatile能保证什么不能保证什么。正确选项是“保证可见性和有序性不保证原子性”多选里有人会把“原子性”也选上这就是送分变送命。我的经验是Java集合和并发不要只看博客最好打开JDK源码自己顺一遍。不需要每一行都看懂但HashMap的putVal、resizeConcurrentHashMap的addCount这些核心方法的执行流程至少要能在脑子里画出图。笔试选项往往出在“边界条件”上比如扩容时原链表分裂成低位链和高位链正好对应(e.hash oldCap) 0这个判断。3.2 JVM内存模型与GCJVM相关题目也是固定项目。有一道题给了几行代码问对象在内存中的分配区域。实际上对象一般分配在堆上但如果开启了逃逸分析且对象没有逃逸出方法则可能被分配在栈上。除此之外静态变量在JDK 8以后存放在堆中的Class对象里而不是方法区。这些细节如果只看概念很容易选错。GC部分考了G1垃圾回收器的特点比如它把堆划分成多个Region维护 Remembered Set 来实现跨Region引用并且通过Young GC和Mixed GC来回收。还有一道题在问常见的垃圾回收算法里哪些会“Stop The World”。这道题我错了一半因为CMS在初始标记和重新标记阶段也会STW并不是只有Serial才停。准备JVM时与其死背参数调优不如把“内存区域分配、类加载双亲委派、GC Roots枚举、常见收集器的工作步骤”串成一条线。笔试很少问具体参数值但经常考“这个对象什么时候能回收”“哪些对象可以作为GC Roots”这类概念判断题。3.3 数据库索引与事务数据库的选择题基本绕不开索引和事务隔离级别。有一道题给了一条SQLSELECT * FROM orders WHERE user_id 123 AND status 1;然后问建立哪个索引最优。很多人的第一反应是给status建索引因为条件里有等值判断。但正确答案通常是要考虑区分度user_id的区分度远高于status所以联合索引(user_id, status)是最优解同时还能利用最左前缀原则。事务隔离级别也考了好几遍。有一道多选问“在可重复读隔离级别下当前读和快照读的区别”。在MySQL InnoDB中SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE属于当前读读取的是最新版本普通SELECT属于快照读走的是事务开始时的快照。这道题我漏选了“普通SELECT不会看到其他事务已提交的新插入数据”这个选项因为我对RR隔离级别下MVCC的ReadView生成时机理解得不够深。让我意外的是数据库还考了一道SQL调优题给了一条执行很慢的查询和EXPLAIN结果问可能的优化方案。这类题不是死记硬背而是考察你能不能看懂type、key、rows这几个字段。所以备考时一定要自己跑一跑EXPLAIN至少知道ALL和ref的区别。3.4 网络协议与操作系统网络考的反而比较常规TCP三次握手四次挥手、TIME_WAIT出现的原因、HTTP和HTTPS的区别都有涉及。有一道题问“当客户端主动关闭连接后进入TIME_WAIT状态的目的是什么”答案是确保最后一个ACK能够到达服务端以及让旧连接的报文段在网络中自然消失。这个考点属于“八股文里的常青树”只要认真背过就没什么问题。操作系统选择题里有一道关于进程和线程的题问“同一进程里的线程共享哪些资源”。共享堆和方法区不共享栈和寄存器上下文。另外一道题考死锁产生的四个必要条件其中“循环等待条件”和“互斥条件”最容易混淆多选里如果把“剥夺条件”选上就错了因为死锁不能通过“不可剥夺”描述准确说法是“请求并保持”和“循环等待”。我的建议是网络和OS不需要追求把每一层协议都背下来重点抓住高频考点TCP状态流转、Linux常用命令、进程调度、虚拟内存、死锁四条件。如果时间充裕尽量用“给别人讲一遍”的方式复盘能顺畅讲出来的知识考试时才不会犹豫。4. 场景设计题为什么电商公司总爱考秒杀淘天的研发岗笔试比较有特色的是最后一道设计题。它不是让手写代码而是用文字描述方案有点像“系统设计”的简化版。今年我遇到的是“设计一个秒杀系统需要考虑哪些模块如何防止超卖”。这类题没有标准答案但能明显拉开有真实项目和单纯刷题的候选人差距。4.1 如何设计一个秒杀系统从“前端到后端再到数据库”我当时的答题结构是这样拆的前端页面静态化、按钮置灰、答题校验码挡住大部分机器流量网关层IP限流、用户维度限流、单用户单商品限购应用层先读Redis缓存库存用Lua脚本原子扣减异步化扣减成功后把订单消息发到MQ数据库异步落单数据库兜底库存扣减用乐观锁或条件更新防止超卖这个题的核心是“库存扣减不能丢”但也不能把压力全打到数据库。我特别写清楚了Redis预扣库存和数据库最终扣减的关系先让用户在Redis层拿到一个“购买资格”再异步去数据库创建订单如果订单创建失败或者超时未支付库存要回补。我当时补了一句“热点商品Key要打散”比如把库存拆成多个子库存Key避免所有请求都打到同一个Redis实例上。后来复盘时觉得这句话可能是拿分点因为大部分人只会说“用缓存扛住流量”却不会想到单Key热点问题。4.2 订单超时未支付怎么处理设计题里还附带了一问“订单创建后30分钟未支付系统如何自动关闭订单并释放库存”这其实是电商场景里的经典延时任务问题。我的方案是分级处理订单创建时发送一条延时消息到RocketMQ30分钟后消费者检查订单状态如果已支付无事发生如果未支付关闭订单、回补库存同时配合定时任务扫表兜底比如每5分钟扫描一次创建时间超过35分钟且未支付的订单数据库事务保证关闭订单和回补库存的原子性用分布式锁防止并发重复关闭这道题考的不只是技术还有“边界条件”意识。比如客户端支付成功但消息延迟到达导致订单已经被关闭这时需要有对账机制支付回调来了以后要能重新激活订单或进入异常处理流程。放在实际业务里这就是掉单、卡单、死信消息等问题的处理思路。4.3 从业务题看淘天的技术偏好从这套设计题能明显看出淘天这类电商公司对研发的期望不要求你写出炫酷的框架但要求你理解流量、并发、数据一致性之间的关系。秒杀、订单超时、库存扣减这些场景在电商业务里非常典型哪怕是校招候选人也希望能有“分层思维”而不是只堆砌技术名词。我写答案的时候没有上来就列Redis、MQ、Elasticsearch这些组件而是先定义一个核心问题“秒杀系统的瓶颈是什么”。答案自然分成两步读多写少的商品详情页用CDN和缓存扛写多且需要精确扣减的库存请求用Redis加MQ削峰。思路清晰了技术选型只是顺理成章的结果。5. 复盘笔试踩坑与时间分配心得笔试结束后我专门花了一晚上复盘有几个坑是真实踩过以后才明白的。如果你后面也要参加类似笔试这些细节可以直接避免。5.1 选择题不要太恋战我原本以为选择题每题最多一分钟就能搞定结果遇到几道代码题和多选题花了将近15分钟。特别是多选题选项里经常有两个“看起来都对”的干扰项比如JVM那道题我反复读了半天最后还是少选一个。考完复盘我的时间分配计划应该是这样单选加多选控制在40分钟以内哪怕有一道题拿不准也先标记后跳过。因为后面每道编程题至少需要20至30分钟如果选择题拖到50分钟编程题就会非常紧张。我考试时选择题花了45分钟导致最后一道设计题只能草草写几个要点这非常吃亏。5.2 编程题要先看懂输入输出再动手编程题最大的坑不是算法本身而是输入输出解析。尤其第一道字符串题它给的输入样例是一行但实际测试用例可能有多组输入中间用空行分隔。我一开始用Scanner.nextLine()只读了一行自测能过但提交后直接0分后来才改成while (sc.hasNextLine())循环读取。另外要注意的是ACM模式下题目要求输出格式必须和示例一致多一个空格、少一个换行都可能判错。我在第三道拓扑排序题就吃过亏多输出了一个末尾空格导致提示“Presentation Error”但系统归为未通过。后来我所有输出都采用StringBuilder统一拼接最后统一去掉最后的逗号或空格这样基本不会出错。5.3 心态和做题顺序笔试过程中心态影响很大。我一开始看到第一道题很简单就有点轻敌结果第二道DP题卡了20分钟心里一下慌了第三道拓扑排序看题都不太专心。如果你也遇到这种情况记住一个原则稳住能拿的分比啃难题更重要。实际考试时我建议按“编程题-设计题-选择题”的顺序做或者先快速扫一眼所有编程题挑最简单的先写。因为编程题分值占比最高越到后面心里越急错误率越高。选择题哪怕最后只剩10分钟也能靠印象蒙几道但编程题没有完整时间根本写不完。6. 笔试之后给下一届候选人的备考清单笔试只是第一关后面还有面试。但笔试成绩会直接影响面试官对你的初始印象尤其是编程题AC情况甚至可能被面试官拿出来追问。所以如果有下一次准备我会把精力投放在这几个方面。6.1 刷题量与重点范围不要盲目追求500题、800题关键是按tag把高频题吃透。对我来说最有效的刷题范围是动态规划背包、最长上升子序列、编辑距离、状态机DP二叉树遍历、最近公共祖先、层序遍历、路径和字符串反转、滑动窗口、前缀和、Top K图论拓扑排序、最短路径、并查集数据结构LRU缓存、单调栈、优先队列建议每天固定刷5道题其中至少2道是独立写出来的而不是看一眼题解就过。淘天的笔试更偏向“业务包装过的算法题”所以刷题时要多训练自己把题干里的业务词汇翻译成算法模型。比如“包裹收益最大化”就是DP“服务依赖顺序”就是拓扑排序。6.2 八股文背诵的正确方式八股文不要死记硬背但也不能完全不背。比较好的方式是整理成“为什么”的问答。比如“为什么HashMap线程不安全”不能只说“多线程put会导致死循环”还要说清楚JDK 8前头插法在扩容时可能形成环形链表JDK 8后尾插法不会再死循环但数据丢失和size不准确仍然存在。我建议准备一个自己的知识库按线程、JVM、集合、MySQL、Redis、网络分类。每天挑一个主题试着不看资料讲5分钟。能讲出来、讲明白才是真正掌握。笔试选择题里很多“看似正确但实际错误”的选项就是专门挖给没理解透的人的。6.3 项目经验怎么和笔试能力衔接如果你有实际项目尤其是涉及高并发、缓存、消息队列的项目一定要把项目里的决策思路整理成“面试官追问版”。比如项目里用Redis分布式锁解决超卖问题那你需要能回答为什么不用synchronized锁的Key怎么设计如果Redis挂了怎么办同一线程重入怎么处理这些其实和笔试设计题是同一个逻辑。我当时因为项目里做过一个简单的秒杀Demo设计题写起来就顺很多。但我的短板是项目里的技术点比较散没有从“流量入口到数据存储”完整串联起来笔试时有些模块想到了但没写透。所以准备笔试时顺手把项目架构图画一遍把每个环节选型的原因和备选方案写下来这个动作既服务笔试设计题也服务后面的技术面。如果让我给一个最具体的建议就是不要把笔试当成“考完就忘”的任务而是把它当成一面镜子照出你知识体系里真正薄弱的地方。复盘一道错题比盲目做十道新题更有价值。