腾讯音乐技术研究岗笔试复盘:题型解析与备考攻略 2023年春招那阵子我正好蹲完了腾讯音乐技术研究岗的第一批笔试。说实话这场笔试和我预想的不太一样它既不像纯后端那样死磕高并发架构也不像算法岗那样全是论文复现而是把“技术研究”这四个字拆得很细基本功、算法落地能力、对数据结构的理解深度都在两道半小时的机试里铺开了。当时做完我就有一种感受这笔试筛选的不是你会多少冷门模型而是你在压力下能不能把基础问题写干净。这篇文章我把它从头到尾复盘一遍包括题型结构、每道题背后的考点、我当时是怎么思考的、以及后来和同批进面的朋友对答案时发现的坑。如果你正准备投腾讯音乐或者其他大厂的技术研究岗这份复盘应该能帮你少走不少弯路。1. 腾讯音乐春招技术研究岗笔试的整体认知先说一个容易误解的点腾讯音乐的技术研究岗不等于纯算法岗也不等于纯开发岗。它更像是一个“算法思维 工程落地”的混合体笔试题目里你能明显感觉到这种混合气质。1.1 这场笔试到底在考什么腾讯音乐的业务线大致分为在线音乐、社交娱乐、长音频这几块。技术研究岗的候选人进去之后大概率要面对三类问题推荐系统的召回、粗排、精排、重排链路优化音频内容的理解比如歌曲标签、音色特征、歌词情感分析用户行为数据的挖掘比如付费预测、留存分析、异常流量识别这决定了笔试不会只考排序算法和二叉树遍历还会带上机器学习的理论题以及一些和数据处理相关的场景题。我印象最深的是选择题里出现了不少关于特征工程、模型评估、采样偏差的知识点这在别的公司后端笔试里很少见但在这类岗位里非常合理。说白了他们需要的是一批能直接用数据解决问题的人而不是只会写 CRUD 的代码工。第一场笔试的时间安排在晚上七点到九点半共150分钟题量是20道选择题单选加多选混合 3道编程题。选择题每题分值不太一样多选错选、漏选都不得分这个大家一定注意拿不准的宁可少选。1.2 第一批笔试的筛选逻辑与时间节奏春招的时间节奏大家要有个数一般是二月底到三月初投简历三月中旬陆续开始笔试四月初就进入面试密集期。腾讯音乐的第一批笔试通常在三月中旬的某个周三晚上和腾讯集团其他事业群的笔试错开方便候选人多投几个部门。我当时就是先做了腾讯音乐的第一批后面又陆续做了CSIG和WXG的笔试对比下来腾讯音乐的题目风格相对友好一些至少没有出现那种故意刁难人的冷门数学证明题。筛选逻辑上我复盘下来感觉是这样编程题是第一道分水岭AC 两道基本就能进面试选择题决定你排位的上限错得太多会被面试官质疑基础代码风格和复杂度会作为参考维度但不是硬性指标我认识的同批笔试的人里有人三道题全AC但选择题错了一半最后还是进了面试说明编程题权重更高。但如果你编程题只做出一道选择题全对也没用大概率会被刷。2. 技术笔试的题型拆解与核心知识点这一部分我把选择题的考察范围拆开讲因为这些题目很能反映公司对基础能力的要求。不像编程题可以在力扣上刷到原题选择题考察的点比较杂需要你有系统性的知识结构。2.1 选择题考察范围从数据结构到机器学习理论那20道选择题我大致分成四类第一类是数据结构与算法基础大概占6道。考的是栈和队列的性质、二叉树的遍历顺序、哈希冲突的处理方式、排序算法的稳定性这类经典问题。说实话这些题目在牛客网上都能刷到原题只要把大二学的数据结构课本重新过一遍问题不大。但有一个小坑腾讯音乐的选择题喜欢给变形题比如“用两个栈实现队列的均摊时间复杂度是多少”这种题如果你只是死记答案换个问法就懵了。第二类是机器学习基础大概占5道。这道题我之前没怎么准备全靠临时抱佛脚结果考到了决策树的信息增益计算和 K-means 的收敛性判断。这两题都偏理论需要你能手算信息熵理解 EM 算法的思想。我建议投这个岗位的同学一定提前复习朴素贝叶斯的条件独立假设、逻辑回归的损失函数、SVM 的核函数选择、随机森林的抽样方式这些都是高频考点。第三类是数据库和操作系统基础大概占5道。数据库考了 B 树索引、事务隔离级别操作系统考了进程调度算法、死锁的四个必要条件。这些属于计算机基础八股文提前背一背就能拿分没什么好说的。第四类是网络和 Linux 基础大概占4道。TCP 三次握手和四次挥手是必考的HTTP 和 HTTPS 的区别也出现了。Linux 那块考的是查看进程端口号的命令netstat 和 ps 的使用场景区分这个对平时主要在本地写代码的同学来说可能有点陌生建议提前刷一下常见的 Linux 命令。2.2 高频算法考点与解题思路把选择题里涉及的部分算法考点整理一下大家可以对照自查考点考察方式准备建议二叉树遍历手写前中后序遍历根据两种遍历求另一种掌握递归和迭代两种写法注意边界条件动态规划状态转移方程的推导先确定 dp 数组含义再找 base case贪心算法找局部最优解的策略多刷区间调度、跳跃游戏这类经典题哈希表冲突解决方式均摊复杂度分析理解链地址法和开放寻址法的区别排序算法稳定性、时间复杂度、空间复杂度快排、归并、堆排序必须能手写图论最短路径、最小生成树Dijkstra 和 Prim 的模板代码要背熟特征工程缺失值处理、归一化、离散化理解不同方法的适用场景模型评估精确率、召回率、F1、AUC 的区别能根据业务场景选择合适的评估指标这里要特别说一句动态规划和图论是编程题的重头戏笔试三道题里至少有一道是动态规划有时候还会有一道图论的变种。所以如果你时间有限优先把这俩啃下来性价比很高。3. 编程题的实操复盘与解题思路编程题就三道但因为是 ACM 模式需要自己处理输入输出和平时在力扣上刷题的函数补全模式完全不一样。这个细节特别重要你平时刷题刷得再多如果没适应 ACM 模式考试的时候光是调输入输出就能浪费半小时。3.1 三道编程题案例拆解第一题数组去重并保持相对顺序简单题目大意是给定一个整数数组去除重复元素要求保留每个元素第一次出现的位置输出处理后的数组。比如输入[3, 1, 2, 1, 3, 4]输出[3, 1, 2, 4]。这道题属于送分题但要注意输出格式是一个数组逗号和空格都有严格要求。我的做法是用一个 HashSet 判断重复一个 ArrayList 保存结果遍历一遍就搞定。Python 里可以用dict.fromkeys()一行实现但建议还是老老实实写循环以防判题系统对类型有要求。第二题最长连续递增子序列的变种中等题目的描述有点绕大意是给定一个数组你可以选择最多删除一个元素求删除后能得到的最长连续递增子数组长度。比如输入[1, 2, 3, 1, 2, 5, 6]删除中间的那个1之后剩下的数组中最长的连续递增子数组是[1, 2, 3, 5, 6]长度为 5。这道题我一开始想复杂了用滑动窗口加状态标记来做结果代码越写越乱。后来冷静下来重新审题既然只能删除一个元素那我只要维护一个left数组记录每个位置作为结尾的最长递增长度再维护一个right数组记录每个位置作为开头的最长递增长度。然后遍历每个位置假设删除它看它前后的递增序列能不能通过拼接形成一个更长的递增序列。拼接的条件是nums[i-1] nums[i1]。如果满足长度就是left[i-1] right[i1]如果不满足只能取max(left[i-1], right[i1])。把每个位置都尝试一遍取最大值就是答案。核心代码大概长这样def longest_increasing_subarray(nums): n len(nums) if n 2: return n left [1] * n right [1] * n for i in range(1, n): if nums[i] nums[i-1]: left[i] left[i-1] 1 for i in range(n-2, -1, -1): if nums[i] nums[i1]: right[i] right[i1] 1 ans max(max(left), max(right)) for i in range(1, n-1): if nums[i-1] nums[i1]: ans max(ans, left[i-1] right[i1]) else: ans max(ans, max(left[i-1], right[i1])) return ans这道题的时间复杂度是 O(n)空间复杂度也是 O(n)。说实话当时我写出这个解法之后整个人松了一口气因为感觉笔试已经稳了大半。第三题带权图的路径优化问题困难这道题是把一个音乐推荐场景抽象成了图论问题有 n 个节点和 m 条边每条边有长度和愉悦值两个属性要求在路径总长度不超过限制的前提下最大化路径的愉悦值总和。我把暴力搜索的思路写了一下然后用最短路先剪枝但最终只过了一半的测试用例。后面复盘的时候想明白了这道题的正解应该是分层图最短路把“剩余长度限制”作为图的层数维度但实际上层数太大了所以更好的方式是二分答案加 Bellman-Ford 或 SPFA 的变种。这道题筛掉了不少人因为它不仅考最短路还要你在一个约束优化问题里设计状态。三道题能全 AC 的人很少我当时 AC 了两道半已经算不错了。3.2 ACM模式的代码细节和笔试环境的坑第一次参加在线笔试的同学强烈建议提前去牛客网做几套 ACM 模式的模拟题。这个模式要求你自己写readline读数据、自己print输出结果格式稍有不对就会判错。我整理了三个最常见的坑输入可能有多组测试数据需要用while循环读到底不能用sys.stdin.readline()只读一行就结束输出要不要带行尾空格这个不同题目要求不一样保险起见用 .join()输出注意 Python 的递归深度限制如果遇到树或图的深度优先遍历要先sys.setrecursionlimit(1000000)否则直接栈溢出还有一个很重要的点笔试过程中可以切出页面查 API 文档吗以我那次的经验系统会监控切屏次数切出去一次就弹一次警告切多了可能直接交卷。所以常用函数的写法一定要提前记牢别指望现场查文档。4. 备考方法与时间规划如果你现在还在准备投递这个岗位我想分享一些从这场笔试里总结出来的备考建议按时间线来排会比较有效。4.1 信息收集与真题复盘笔试前一周我做了三件事第一去牛客网搜了腾讯音乐往年的面经和笔经把出现过的高频考点记下来。虽然每年题目都会变但大方向不会变尤其是选择题的考察范围重复率很高。第二把机器学习基础算法重新过了一遍。我用的是《统计学习方法》和李航的《机器学习》重点看了决策树、支持向量机、朴素贝叶斯、K近邻、逻辑回归这几个经典模型。时间不够的话不需要深究数学推导但至少要知道每个模型的假设、损失函数、优缺点。第三刷了力扣上大约 50 道题集中在动态规划、贪心、二分、链表、二叉树这几个模块。题目难度从 Medium 到 Hard把常见题型的模板代码整理到了一个文档里考前过了两遍。提示腾讯音乐的笔试系统用的是赛码网还是牛客网每年可能不一样。建议提前确认系统入口用同一个浏览器登录并且提前测试摄像头和麦克风。4.2 高效的刷题策略别盲目刷要有优先级很多人备考就是刷力扣 HOT 100但我觉得按专题刷比按题号刷更有效。下面是我摔了两次跟头之后总结出来的优先级动态规划必考。重点刷 最长递增子序列、编辑距离、打家劫舍、背包问题二叉树必考。重点刷 三种遍历、最近公共祖先、二叉树的序列化与反序列化图论高频。重点刷 拓扑排序、最短路径、并查集数据结构设计中频。重点刷 LRU、最小栈、用两个栈实现队列每天刷题的时间不用太长两小时就够了但一定要动手写完整代码不能只看思路。有些题目看题解觉得很简单实际写的时候一堆边界条件处理不到位在 ACM 模式下会直接暴露出来。4.3 软实力的准备笔试只是起点笔试过了之后面试流程大概是这样一轮技术面一轮算法强化面一轮 HR 面。技术面里会被问到项目经历和实习经历而且面试官很可能会抓着笔试里的某一道题追问你的优化思路。我同学就在面试时被问到“你笔试第二题的空间复杂度是 O(n)能不能优化到 O(1)”如果笔试结束后没有回过头去复盘这种问题真的容易卡壳。所以笔试完别着急放松把做出来的题好好想一想有没有更优解没做出来的题搞懂正解这部分复盘对后续面试的帮助很大。如果你还有时间建议把自己做过的项目整理成 STAR 法则描述的简历条目情境、任务、行动、结果。腾讯音乐的面试官很看重候选人对自己项目的思考深度项目不一定要多高级但你要能说清楚为什么选这个方案、有没有对比过其他方案、遇到过什么坑。5. 常见问题与笔试避坑指南这部分我把笔试现场和备考期间大家最常踩的坑整理成一个速查表方便你考前最后检查一遍。常见问题我的建议零基础能不能投技术研究岗可以但至少要能独立写出二叉树遍历和动态规划的代码不然笔试会很难看选择题要不要死磕单选不会就蒙一个多选不确定的宁可不选因为错选倒扣分编程题时间怎么分配第一题10分钟第二题30分钟第三题40分钟剩下时间检查输入输出要不要自带IDE一般系统自带代码编辑器但不一定有补全功能提前适应无补全手写代码如果第一题就卡住了先跳到第二题稳定拿分更重要不要和一道题死磕笔试设备有什么要求台式机或笔记本提前测试摄像头网络关掉所有会弹窗的软件还有一个很多人忽略的细节就是用本地 IDE 写代码时注意自动缩进和制表符的问题。有些判题系统对 tab 和空格混用有警告虽然不至于判错但万一遇到格式敏感的情况就很冤。建议统一用四个空格缩进。关于作弊和雷同代码的提醒笔试系统会跑代码相似度检测如果你和网上某篇题解的代码一模一样哪怕是很早以前发的也有可能被标记。所以我的建议是以理解思路为主代码自己敲至少变量名要换成自己的风格。这个习惯对面试手撕代码也很有帮助因为面试官通常会现场看一眼你的代码习惯。另外考场上有一个心态问题容易被忽略因为监控系统会记录鼠标离开页面的次数所以哪怕你只是不小心点到其他窗口也会被提示“检测到切屏行为”。第一次看到提醒内心会很慌这时候深呼吸继续做就行不要因为这个影响了做题节奏。6. 这场笔试给我带来的几点技术思考笔试结束之后我一直在想一个问题为什么腾讯音乐要采用这种“选择题 编程题”的混合笔试方式后来我想明白了因为技术研究岗既需要理论底子也需要动手能力。选择题是筛理论底子的编程题是筛动手能力的两道都拿高分的人大概率就是部门想要的候选人。从题目设置来看有一个趋势很明显纯八股文比重在下降场景化、业务化的题目在增加。比如那道带权图路径优化题如果直接考裸的最短路算法很多人都会做但换上“音乐推荐路径”的壳子之后就需要你具备把业务问题抽象成算法模型的能力。这种能力是刷题刷不出来的需要在平时做项目时有意识地锻炼。还有一点我觉得腾讯音乐的笔试特别看重代码的健壮性。不只是通过测试用例还包括考虑到空数组、单元素数组、全相同元素数组、数值溢出这些边界情况。我第二题能拿满分的其中一个原因就是我把这些边界情况都想到了。经历完这一场笔试我最大的感受是大厂技术岗的笔试不只是考你会不会做题更是在考验你在限时、限环境的情况下的工程判断力。你的代码是否简洁、你的思路是否清晰、你在遇到不会的题目时是否懂得取舍这些都会在代码里暴露出来。6.1 关于后续扩展这个方向还能怎么准备如果你拿到了面试机会建议顺着这个方向再准备一下推荐系统的基础链路召回、粗排、精排、重排每个环节的典型模型音频特征提取的基础概念MFCC、Mel谱、CNN 在音频分类里的应用大规模数据处理的意识如果数据量是十亿级别你的算法还能不能跑这些内容不一定都会问但问了之后你不会显得毫无准备。毕竟技术研究岗的“研究”两个字意味着你需要具备独立调研和快速学习的能力而这个能力在面试里最直接的体现就是——你知道哪些知识是自己不会的并且知道怎么在短时间内补齐。笔试只是这场求职长跑中的一站在这里稳住后面的路会顺畅很多。