腾讯音乐秋招技术测试岗笔试复盘:赛码网算法题全解析
腾讯音乐秋招技术测试岗的第二批笔试最近在牛客和赛码网话题下讨论度一直不低。我完整走了一遍从投递到笔试的全流程第二批的卷子整体难度和第一批差不多但题型侧重点有点变化尤其是算法题里树和动态规划的占比明显上来了。这篇东西就把我当时做题的思路、题型拆解、赛码网平台的各种细节还有考完之后的复盘方法全整理出来。无论是今年准备冲大厂测试岗的同学还是想转测试开发的朋友都可以拿这份东西当个参考。先交代一下背景。腾讯音乐这边秋招分了好几个批次我报的是技术测试岗第二批笔试安排在赛码网平台上进行。整个笔试是双机位监控考试时长大概2小时卷子主体是两道算法编程题部分批次的同学还会遇到一道测试用例设计题或者说一说思路的简答题。相比后端开发岗的卷子测试岗的算法题难度会稍微友好一点但也没有友好到可以裸考的程度。换句话说如果你刷题量不到100道现场临时推算法大概率是写不完的。1. 技术测试岗笔试到底在考什么1.1 大厂招测试最看重什么能力很多同学有个误区觉得测试岗不考算法或者觉得测试就是点点点。实际上大厂的技术测试岗笔试反而不太考纯测试理论而是直接上算法题。原因很简单技术测试岗或者说测开岗日常要写自动化脚本、搭测试框架、做性能分析、定位线上问题这些工作全都离不开代码功底和逻辑思维。测试用例设计的本质其实就是边界分析和路径覆盖这和算法题里对边界条件的处理是相通的。所以腾讯音乐笔试的筛选逻辑就很清晰了第一道题看你基础编程能力扎不扎实第二道题看你有没有算法思维。至于测试理论那是面试环节才重点考察的。笔试阶段把两道算法题AC掉基本就已经拿到了面试入场券。1.2 第二批笔试的节奏和变化第二批的时间点大概在9月中下旬这个阶段很多公司的笔试都挤在一起腾讯音乐这场和另一家互联网大厂的笔试时间甚至直接撞了。我当时是二选一最后选了腾讯音乐因为技术测试岗的专场批次相对少机会更珍贵。和第一批相比第二批的卷子并没有出现什么偏题怪题整体还是围绕二叉树、动态规划、二分答案、字符串处理这几个常规大项。但有个变化值得注意第一批的题量更少有的同学反馈只有一道编程题第二批几乎都是两道题起步。这其实说明腾讯音乐对技术测试岗的代码要求是在提高的不再满足于“会写一道题”而是希望候选人具备稳定解决多个问题的能力。1.3 为什么建议提前熟悉赛码网赛码网是很多大厂校招笔试使用的在线平台腾讯音乐用的就是它。赛码网和牛客的笔试系统体验差异挺大最直观的感受是赛码网的代码编辑器比较朴素语法高亮和自动补全都很弱更不用说代码提示了。如果你平时习惯了在IDE里写代码突然切到赛码网的网页编辑器光适应手感和调整缩进写法就要花掉几分钟。另外一个点是赛码网对输入输出的要求比较严格。它不像力扣那样把输入都封装好了而是比较贴近ACM模式需要你自己处理标准输入自己写循环读数据。如果不提前熟悉这个模式就算算法思路完全正确也可能因为输入没读对被判定成答案错误。提前用赛码网的在线模拟环境练两套题成本很低收益却非常直接。2. 笔试题型拆解与核心知识点2.1 第一梯队树与搜索第二批笔试的算法题里树相关的内容是绝对的高频。二叉树、层序遍历、最近公共祖先、最大深度这些题目在大厂测试岗的笔试里出现概率非常高。我这场遇到的第一题就是二叉树相关的题目具体是给定一个二叉树要求返回树的每一层中节点值的最大值组成的列表。这个考察的是树的层序遍历属于BFS的典型应用基础但很能检验代码功底。思路其实不复杂用队列做层序遍历每一层先记录当前队列的长度然后循环处理这一层的节点同时记录最大值。等这一层处理完了把最大值放进结果列表再继续下一层。代码写起来也不长但要注意几个细节队列要用LinkedList实现不要用ArrayList来模拟队列操作还有就是对空树的处理根节点为null时应该直接返回空列表而不是报空指针。这里给一个当时写的参考版Java实现import java.util.*; public class Main { public ListInteger largestValues(TreeNode root) { ListInteger result new ArrayList(); if (root null) return result; QueueTreeNode queue new LinkedList(); queue.offer(root); while (!queue.isEmpty()) { int size queue.size(); int maxVal Integer.MIN_VALUE; for (int i 0; i size; i) { TreeNode node queue.poll(); maxVal Math.max(maxVal, node.val); if (node.left ! null) queue.offer(node.left); if (node.right ! null) queue.offer(node.right); } result.add(maxVal); } return result; } }这里强调一下赛码网的输入通常是按层序列化给的数组你需要先把数组还原成二叉树再调用算法函数。所以现场除了要会写核心逻辑还得知道怎么根据输入的字符串构建二叉树。这个点是很多同学在赛码网上翻车的重灾区后面我专门会详细说。2.2 第二梯队动态规划动态规划在测试岗笔试里属于那种“知道就不难不知道就硬写不出来”的题型。第二批笔试考到的DP题偏经典主要集中在背包类问题和子数组、子序列类的框架上。我当时遇到的是背包的一个变体题目大意是有若干任务每个任务有耗时和收益要求在给定总时间的限制下选择任务让总收益最大。这个典型的0-1背包问题用一维dp数组做空间优化就是标准的解法。定义dp[j]表示在总耗时不超过j的情况下能获得的最大收益然后遍历每个任务倒序更新dp数组。倒序更新的原因是为了保证每个任务只选一次如果正序更新同一个任务就可能被重复选择这就变成完全背包了是一个很经典的坑。我之前在实际笔试里栽过这个跟头后来总结了一个易错点速查表易错点错误表现正确做法一维背包遍历顺序从0到capacity正序遍历必须从capacity向下遍历到当前物品重量dp数组初始化全部初始化为0背包问题通常初始化0恰好装满时初始化负无穷物品重量超过容量直接数组越界跳过当前物品数据类型溢出收益累加超出int使用long类型2.3 第三梯队二分答案与边界思维第三道题我用二分答案来解的这也是我笔试环节觉得最有意思的题。题目是把一个数组按顺序分成m段要求让这m段各自的和的最大值尽可能小输出这个最小的最大值。这个问题的名字叫“分割数组的最大值”在很多大厂笔试和面试里都出现过它的思路是典型的“二分答案”。为什么能想到二分因为最后要求的答案是一个数而且这个数有明确的单调性如果我们把“每段和的上限”设成一个很小的值那数组能分成的段数就会变多如果上限设很大段数就会变少。利用这个单调关系可以二分搜索这个上限值。check函数就是模拟分段看看在当前上限下能不能用不超过m段装下所有数字。这道题里最考验边界思维的地方一是二分的左右边界怎么定左边界通常取数组元素的最大值右边界取数组元素的总和二是在分段的时候如果当前元素本身就大于上限说明这个上限设置得太小了直接返回false三是最终收敛时left就是答案。这种从“求最值”转化为“验证可行性”的思路和测试里对输入边界做极端验证的思维是完全一致的所以这个题被放在技术测试岗的卷子里我觉得是挺合理的考察。这里给出一个C版本的参考实现#include vector #include numeric #include algorithm using namespace std; bool check(vectorint nums, int m, long long limit) { int count 1; long long sum 0; for (int num : nums) { if (num limit) return false; if (sum num limit) { count; sum num; } else { sum num; } } return count m; } int splitArray(vectorint nums, int m) { long long left *max_element(nums.begin(), nums.end()); long long right accumulate(nums.begin(), nums.end(), 0LL); while (left right) { long long mid left (right - left) / 2; if (check(nums, m, mid)) { right mid; } else { left mid 1; } } return (int)left; }二分答案这类题在测试岗笔试里出现的逻辑其实很清晰测试工作本身就是不断验证系统在极端输入下是否还能保持正确这种“设一个上限验证是否可行再调整上限”的思路本质上就是对系统做二分式排查。3. 赛码网笔试实操流程与细节3.1 从邀请到进入考场的完整流程腾讯音乐的笔试邀请邮件一般会提前两三天发到邮箱邮件里会附上赛码网的考试链接、考试时间、注意事项以及一个模拟测试入口。我强烈建议收到邮件后立刻去模拟测试入口走一遍完整流程因为你至少需要确认三件事摄像头能否正常开启、屏幕共享功能是否可用、你的浏览器能不能正常进入在线编辑器。到了正式考试时间提前20分钟进入考场页面等待。进去后会先做身份确认然后有一个拍照环节之后就是环境检测。赛码网会要求你打开摄像头权限和麦克风权限麦克风一般是备用防止代考这些权限一旦被浏览器拦截安装插件或者重新授权都会浪费时间。所以如果有条件直接使用Chrome或者Edge浏览器提前把赛码网域名加入摄像头和麦克风的允许列表。整个考试过程中如果切出考试页面系统会记录一次切屏行为。切屏次数过多会被标记为作弊嫌疑严重的话直接判定成绩无效。我有朋友因为不小心切出去回微信消息被警告了两次虽然最后成绩还是被保留了但整个过程心态崩得厉害第二道题基本没静下心写。所以考试期间最好把所有通讯软件都关掉。3.2 输入输出模板与编译环境赛码网是ACM模式题目的输入都是标准输入输出则通过标准输出打印。这意味着你不能只写一个类前缀IO处理全部省略。平时用惯了力扣的写核心函数模式的同学第一次在赛码网上写题多少会不适应。这里给出一份我常用的Java模板支持从标准输入读取多个整数稳定可靠import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br new BufferedReader(new InputStreamReader(System.in)); String line; while ((line br.readLine()) ! null !line.isEmpty()) { String[] parts line.trim().split(\\s); int n Integer.parseInt(parts[0]); int m Integer.parseInt(parts[1]); int[] arr new int[n]; String[] arrLine br.readLine().trim().split(\\s); for (int i 0; i n; i) { arr[i] Integer.parseInt(arrLine[i]); } int result solve(n, m, arr); System.out.println(result); } } public static int solve(int n, int m, int[] arr) { // 在这里实现核心逻辑 return 0; } }关于Scanner和BufferedReader的选择我多说一句。赛码网上数据量大的时候Scanner的nextInt会有明显的性能瓶颈。虽然大多数笔试题数据量不至于大到把Scanner超时判TLE但如果你同时用了很慢的算法这几倍的输入差距就可能变成压死骆驼的最后一根稻草。用BufferedReader加split解析虽然写起来麻烦一点但性能稳定不需要赌数据大小。C方向的同学直接cin和cout也是没问题的反正编译环境是支持iOS和stdio同步关闭的。但有的版本老建议用万能头文件的时候顺便做一下兼容检查。3.3 本地调试与线上提交的差异赛码网本身自带的在线编辑器调试功能非常有限你很难像在本地IDE里一样打断点、看变量。所以我的习惯是在本地IDE里把代码写好逻辑确认无误后再复制到赛码网的编辑器里。但这里就有一个经典问题本地IDE的JDK版本和赛码网编译环境版本可能不一致。举个例子我写过一段用了lambda表达式和流式操作的代码在本地JDK 17上跑得很欢快但赛码网的Java环境只支持到JDK 8导致编译直接失败白花了20分钟定位。所以在赛码网上写Java尽量用老语法循环、数组、List、HashMap这些基础结构就够了别炫技用var、流式API、switch表达式这些新特性。C同理尽量别用C17才行的新特性万一编译环境不支持编译错误CE一次就亏大了。4. 做题策略与时间分配4.1 先审题再动手别急着敲代码笔试最开始的时候我习惯先把所有题目快速扫一遍搞清楚每道题大概是什么方向、数据范围有多大。赛码网考试页面会一次性展示所有题目可以先快速浏览但不要立刻陷入某一道题里。因为有些时候第二道题的题干虽然长但真正要写的代码反而不复杂而第一道题看着简单数据范围却特别大可能会隐藏深坑。我在第二批笔试里第一题看着顺手就直接开写了写完提交测试了几下都是全过但等我把第二题看了一遍之后才发现第二题反而是我熟悉的二分答案类型如果先做第二题时间会宽松很多。所以现在我的习惯是先花3到5分钟把全部题目过一遍在草稿纸上记下每道题的关键词和预估难度然后按“易到难”的顺序解题。4.2 时间分配建议赛码网上像腾讯音乐这种大厂笔试总时长一般在2小时左右两道题一般分布在10到15个测试用例左右部分测试点数据量小、部分测试点数据量大。我建议的时间分配是这样的前5分钟浏览全卷加理解题意第一题控制在30分钟内完成基本的AC第二题留至少40分钟最后留15到20分钟做边界测试和代码复查。如果你第二题实在没思路宁愿先把第一题的血稳住也不要硬磕第二题导致第一题漏测。还有一种情况题目是一道编程题加一道简答题。简答题通常要求设计测试用例或者描述定位思路这个其实比算法题更好拿分。我的做法是先把简答题用自己的话写清楚通过点罗列出来再回头处理编程题。因为简答题一旦提交时间到了没写就真的白丢了。4.3 不会写的题怎么捞分笔试过程中遇到不会做的题千万别直接空着。赛码网判题系统是按测试点给分的你写一个暴力枚举的解法可能过掉很小一部分测试点也能拿到10%到20%的分数。以我自己的经验大厂笔试最终筛人依据的是总分排名两题都AC的大神当然直接进但如果你第一题AC第二题暴力过了一半点整体排名依然能排在很多“写了一题但第二题空白”的候选人前面。暴力解法的另一个作用是用来验证你后面想出来的正确解法的正确性。可以先写一个绝对正确但时间复杂度高的暴力函数然后小范围随机生成数据对比暴力结果和优化结果的输出如果一致说明优化逻辑大概率没问题。这个思路在赛码网调试不方便的情况下尤其好用。5. 常见问题与排查技巧实录5.1 赛码网报错信息速查笔试过程中最闹心的就是代码提交后报错。这里整理一份常见报错对照表都是我在赛码网和其他大厂笔试平台踩过的坑报错提示含义常见原因处理办法CECompile Error编译错误用了高版本JDK特性类名写错检查类名是否为Main替换新特性语法TLETime Limit Exceeded超时算法复杂度过高或Scanner输入慢优化算法换BufferedReaderMLEMemory Limit Exceeded内存超限数组开太大或递归栈溢出缩小数组范围改循环写法WAWrong Answer答案错误边界条件考虑不周全输入解析错误先看测试点通过率补边界情况RERuntime Error运行时崩溃数组越界、空指针检查循环边界判空5.2 本地对、线上WA的经典原因这个是笔试圈的老大难问题代码在本地怎么跑都对一提交到赛码网就是WA通常有三种可能。第一种是输入输出格式不一致。赛码网的题目可能包含多组测试数据你的代码只读了第一组就退出这样只能过第一组用例。正确做法是使用while循环持续读到EOF。第二种是int溢出。笔试题目如果涉及累加、乘法数据范围很容易超过int的21亿上限。我见过很多人第一道题没问题第二道题用int存累加和直接溢出成负数输出结果当然是错的。解决办法很简单涉及累加、乘积、总和统计的场景直接上long别犹豫。第三种是输出多余内容。有些同学本地调试的时候加了System.out.println(debug: result)这样的日志提交的时候忘记删掉多余输出会被判成WA。这里我建议提交前统一检查一遍把所有System.out.println梳理清楚。5.3 断网、切屏与监考注意事项在线笔试最怕的就是网络抖动。我当时就经历了一次断网大概持续了半分钟虽然系统自动重连了但做题节奏被彻底打乱。所以有条件的话尽量用网线直连或者保证WiFi信号稳定手机热点当作备用方案。如果真的一直断网立刻截屏保存证据考完当天联系HR说明情况有的公司会重新安排一次笔试机会。切屏方面前面说过了赛码网会记录切屏次数。我的建议是考试前把所有无关应用全部退出尤其是微信、QQ、钉钉这类弹窗大户。考试过程中如果突然有弹窗很可能会引发切屏警告这个完全可以通过提前静音和关通知来避免。摄像头也有讲究光线太暗或者逆光系统可能无法完成人脸识别考试会无法开始。提前找一个光线均匀的位置不要戴帽子不要用刘海遮住额头不然中途监控抽查也可能被标记。6. 笔试之后的技术测试岗面试衔接6.1 笔试复盘比笔试本身更值钱考完之后趁着对题目还有印象第一时间把每一道题的思路、代码、测试点分布记录下来。不要纠结于这次过了没有而是认真复盘自己卡在哪了。是二叉树构建方法不熟还是0-1背包的状态转移没推清楚还是二分答案的check函数写挂了我见过不少同学笔试完就彻底扔开其实这是最亏的。大厂的笔试题目风格高度一致你在这家写过的题换个考察角度可能就出现在另一家的笔试或者面试里。那些反复出现的考点恰恰就是技术测试岗最核心的能力模型树结构操作、动态规划状态设计、二分思路、边界判断、字符串处理。把这些常考模型做成自己的模板比盲目刷几十道冷门新题要有用得多。我的习惯是考完立刻把题目分类记进自己的题库里然后在后面一周每天重新独立写一遍。第二次写的时候不看笔记如果还能写出并AC这个知识点才算真正掌握了。6.2 面试强化方向与技术测试岗面经笔试结束之后如果接到了面试通知面试考察的重点就完全不一样了。技术测试岗的面试一般分成三块第一块是项目深挖面试官会揪着你的实习项目或者自研项目问细节比如怎么设计测试用例、怎么处理线上bug、自动化脚本怎么搭的第二块是测试理论基础等价类划分、边界值分析、场景法这些必须能脱口而出而且要能套用到具体例子上第三块是现场手写测试用例给你一个功能点让你当场列出用例覆盖范围。笔试阶段考察的算法思维在面试里会以另一种形式出现。面试官可能给你一个场景比如“有一个接口返回很慢你怎么排查”这时候你用二分定位的思路把前后端问题逐步缩小到某个模块这种思考方式就很加分。说白了笔试和面试考察的是同一套底层能力只是外在形式不同。关于面试准备还建议把笔试题里的边界思维迁移过来。面试官让你设计一个日期计算器的测试用例如果你能很快说出2月29日、闰年、跨世纪年份这些边界场景那基本就稳了。这些边界意识正是笔试阶段刷题时反复训练出来的。结合我自己的经验给接下来要参加腾讯音乐或者其他大厂技术测试岗笔试的同学几条实在的建议第一提前两周做三到五套赛码网模式的模拟题一定要写标准输入输出不用力扣模式第二DP和二叉树是本轮笔试的核心考点优先刷穿这两个专题第三手边准备一张草稿纸做题前把状态表示、状态转移方程画出来再动手写代码第四考前检查网络、摄像头、浏览器权限别让这些基础环境和心态问题拖了后腿。笔试这关说到底拼的不是天赋而是准备程度。算法题有迹可循平台细节提前踩过坑进面试的概率就会高很多。希望这份复盘能帮你少走一些弯路也祝大家笔试都能AC。
