ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

腾讯音乐秋招后端笔试复盘:考点拆解与编程题AC技巧

2026/8/31 2:30:58 拓冰建站 浏览量
腾讯音乐秋招后端笔试复盘:考点拆解与编程题AC技巧 去年这个时候我也是坐在电脑前面对腾讯音乐秋招后端开发岗的笔试页面手心冒汗。考完出来最大的感受是它考的不是你会不会写代码而是你作为后端开发基础扎不扎实、能不能在限定时间内解决问题。腾讯音乐的笔试整体风格延续了腾讯系一贯的“选择题编程题”组合不搞花架子但每一题都能筛掉一批人。这篇内容我整理了很久把我当时踩过的坑、复盘后觉得关键的考点、编程题的完整思路、以及现在回头看更有效的复习路径都写出来了。不管你是准备投2024届补录还是正在备战接下来的秋招只要你目标里有大厂后端开发岗这篇文章值得你花10分钟读完做笔记的地方我都标出来了。1. 笔试整体情况与题型分布先说大家最关心的整体盘子。我参加的那场是腾讯音乐秋招统一笔试时长是90分钟形式是牛客网在线笔试双机位监控。全卷分为三块单选题、不定项选择题、编程题。你没看错选择题是分单选和不定项的不定项少选得部分分、错选不得分这个规则在答题的时候要特别注意。1.1 题型构成与时间分配模块题量单题分值建议用时单选题20题2分20分钟不定项选择5题3分10分钟编程题2题每题20分50分钟总计27题75分90分钟这里要强调一下90分钟的时长其实是有点紧的尤其是编程题如果第一题卡住了后面很容易崩盘。我当时给自己定的节奏是选择和不定项加在一起严格控制在35分钟内剩下55分钟全部砸给编程题。事实也证明这个策略是对的身边有同学在选择题上纠结太久最后编程题只写出来一题非常亏。1.2 评分逻辑与笔试淘汰率笔试通过率不会公布但根据我后来拿到面试资格的时间和身边同学的情况推测这一轮筛选比例不低可能超过一半。腾讯音乐后端岗的笔试核心看的不是总分而是编程题能不能AC以及选择题错得集中不集中。我复盘时发现一个规律如果选择题大面积错在数据结构、操作系统、网络这些基础模块简历大概率直接进人才库如果选择题错得分散但编程题AC了一道以上还是有很大概率进面试。这说明官方在意的不是单点知识有没有背到而是你作为后端开发的基础面够不够完整。另外编程题如果你只有思路、没在编译器里跑通基本拿不到什么分这一点后面我会重点讲。2. 选择题考点拆解数据结构、操作系统、计算机网络与数据库选择题覆盖范围广但高频考点非常集中。我把当时复习时整理的高频知识点列出来顺便把背后的原理讲透。这些东西靠死记硬背很容易记混理解了再做题会稳很多。2.1 数据结构和算法小题别在“简单题”上翻车数据结构在选择题里占大头大概有8到10题。最常考的有这些栈和队列的性质。比如“用两个栈实现一个队列入队和出队的时间复杂度分别是多少”。答案是入队O(1)出队摊还O(1)因为出队时如果输出栈为空需要把输入栈所有元素倒过去。这个倒的一次性开销摊到多次出队上平均就是O(1)。二叉树遍历。给一个前序和中序让你推后序或者给层序遍历让你判断完全二叉树。这类题没有技巧就是多画图。排序算法的稳定性与时间复杂度。快排平均O(n log n)、最坏O(n^2)堆排序不稳定归并排序稳定但空间O(n)。我当时背了一个口诀简单粗暴“不稳定排序就四个——快选希堆”即快排、选择、希尔、堆排序不稳定。哈希表冲突处理。拉链法和开放定址法的区别以及各自在什么场景下更优。这里容易出不定项。还有一个反复出现的点递归算法的时间复杂度分析。比如“T(n) 2T(n/2) O(n)时间复杂度是多少”答案是O(n log n)主定理直接套就行。如果你对主定理不熟建议专门花半小时看一下笔试性价比很高。2.2 操作系统与并发进程线程、死锁、内存操作系统大概出3到5题。别看题量不大考的都是硬骨头。死锁是必考。四个必要条件互斥、占有且等待、不可剥夺、循环等待要能默写还要会判断一个场景是否会造成死锁。我记得有一题是给出了两个进程各自持有并请求的资源情况问是否满足死锁条件这种题画资源分配图最直观。虚拟内存和页面置换算法也是高频。LRU和FIFO的缺页次数计算题我备考时至少见过了三次。要注意LRU用双向链表加哈希表实现这本身也是面试常问的设计题笔试出现也不意外。线程与进程的区别、协程的概念、用户态内核态切换代价这些属于经典八股。进程是资源分配的最小单位线程是CPU调度的最小单位协程是用户态自己控制的调度单元切换开销更小。IO多路复用select、poll、epoll在选择题里也会出现重点记epoll是事件驱动、没有最大连接数限制比select和poll更适合高并发场景。2.3 网络协议TCP三次握手、HTTP、DNS网络也是必考模块大概3到4题。TCP三次握手为什么不能只有两次这个被问烂了但就是年年出。本质原因防止旧的重复连接初始化请求突然到达服务器导致服务器误开一个无效连接。如果你只回答“因为要确认双方的收发能力”也能得一半分但答出“防止失效的连接请求导致资源浪费”才是完整答案。HTTP状态码每年都会考几个。502 Bad Gateway和504 Gateway Timeout的区别我在选择题和面试里都遇到过。502是网关收到了后端无效响应504是网关没在指定时间内收到后端响应一个是响应内容不对一个是根本没响应。TCP和UDP的区别这题以不定项形式出现时容易选错。注意TCP是面向连接、可靠、有序、字节流UDP是无连接、不可靠、无序、报文。还有一个坑UDP也可以实现可靠传输只是要靠应用层自己去做所以“传输层可靠协议只有TCP”这个说法在某些考卷里会被判错但一般出题人默认TCP可靠、UDP不可靠以教材定义为准。2.4 数据库索引、事务隔离级别、SQL数据库大概3到5题作为后端笔试比重相当合理。索引底层为什么用B树而不是B树或红黑树这题几乎必考。答出以下几点就够了B树非叶子节点不存数据单节点能容纳更多索引项树更矮、IO次数更少叶子节点通过链表相连范围查询和排序效率高天然支持全表扫描的优化。红黑树的问题在于树太高不适合磁盘场景。事务隔离级别四个档位要背熟读未提交、读已提交、可重复读、串行化。需要理解脏读、不可重复读、幻读分别在哪个级别被解决。MySQL默认是可重复读但可重复读下仍然可能出现幻读InnoDB通过间隙锁在多数场景下避免了幻读但极端场景如当前读配合条件更新还是可能发生这个深度面试会追问。SQL题一般是给两张表让你写一个查询。比如“查出每个部门薪资最高的员工”用窗口函数ROW_NUMBER() OVER(PARTITION BY dept_id ORDER BY salary DESC)是最简洁的。如果你只用GROUP BY往往会漏掉同薪资的并列情况。笔试环境里SQL题选了之后没有执行验证平时多练写手SQL很重要。3. 编程题实战两道题从思路到AC编程题是笔试的重头戏两道题一般一道偏模拟/贪心一道偏动态规划/数据结构。腾讯音乐当时的题目我记得比较清楚我把题目抽象出来题目细节做了脱敏但考点和代码逻辑完全一致。3.1 第一题字符串重排匹配题目大意给定一个字符串s和一个字符串数组words要求找出words中所有可以由s的字符重排得到的字符串返回它们在原数组中的下标。思路分析这题本质是判断“字符集合是否一致”。最直接的想法是排序后比较但那样复杂度是O(n log n)数组一大就危险。更好的是用字母频率计数维护一个长度为26的计数数组遍历每个单词时对比计数数组即可复杂度O(n)。#include bits/stdc.h using namespace std; vectorint solve(string s, vectorstring words) { vectorint cnt(26, 0); for (char c : s) cnt[c - a]; vectorint ans; for (int i 0; i words.size(); i) { if (words[i].length() ! s.length()) continue; vectorint tmp(26, 0); for (char c : words[i]) tmp[c - a]; if (tmp cnt) ans.push_back(i); } return ans; }这题的关键坑是不要用unordered_mapchar, int去做比较map比较虽然也能做但常数大而且在牛客的编译器上不同编译器对未初始化map的默认值处理可能不一致容易出莫名其妙的问题。固定数组计数是最稳的。另外注意数组越界一旦字符串里有大写字母或者中文这个写法就崩了。3.2 第二题区间覆盖最小删减题目大意给定一系列区间[start, end]求最少删除多少个区间能让剩下的区间互不重叠。思路分析经典的贪心问题。先按区间右端点从小到大排序每次选择结束时间最早且与当前已选区间不冲突的区间这样能为后面留下最大空间。最少删除数 总区间数 - 最多可选区间数。#include bits/stdc.h using namespace std; int eraseOverlapIntervals(vectorvectorint intervals) { if (intervals.empty()) return 0; sort(intervals.begin(), intervals.end(), [](vectorint a, vectorint b) { return a[1] b[1]; }); int keep 1; int end intervals[0][1]; for (int i 1; i intervals.size(); i) { if (intervals[i][0] end) { keep; end intervals[i][1]; } } return intervals.size() - keep; }为什么按右端点排序而不是左端点这是这道题的核心。按左端点排序时你很容易被一个长区间挡住视线明明后面有个短区间才是最优选择。按右端点排序保证每次选中的都是“当前时间线上最早能结束的区间”这是贪心选择性质的体现。这个结论可以写成类似“当前最优解一定包含最早结束的区间”的归纳证明笔试时不需要写证明但面试问起来要说清楚。3.3 牛客ACM模式的输入输出陷阱编程题在牛客网考不是力扣那种给你封装好的函数而是纯ACM模式自己写main函数处理输入输出。这个差别能拦住不少人。一个典型的坑输入数组第一行是长度第二行是元素你如果只用cin n再循环读就没事但如果是字符串带空格就要小心getline吞换行的问题。我当时的做题习惯是先写一个void solve()函数main里只做输入调用这样即使多组测试数据也方便循环调用。另外注意数据范围数组长度超过10^5就别用O(n^2)需要long long的地方一定要用int乘法溢出是笔试里最常见的隐蔽错误。牛客的在线编译器对C标准版本支持不统一有的老编译器不支持C17的某些语法所以我写题时尽量用C11保险语法比如避免用结构化绑定、避免用auto做复杂推导。3.4 编程题复杂度自检1秒能跑多少笔试时间紧张写代码前先估算复杂度。我给自己定了个粗略标准1秒大概能跑5×10^8次简单运算但带数组随机访问要打折实际比赛环境按2×10^8算比较保险。数据范围能接受的算法复杂度n ≤ 10^3O(n^2)甚至O(n^3)n ≤ 10^5O(n log n)O(n)n ≤ 10^6O(n)O(n log n)勉强n ≤ 10^9O(log n)O(1)写题时先看数据范围再定算法这个习惯帮我避免了好几次“写完发现超时”的惨剧。4. 系统设计/简答题如何用15分钟拿下框架分腾讯音乐的笔试卷子里有几个批次在编程题后会加一道简答题虽然不算分但据说会作为面试官参考。我当时遇到的是“设计一个音乐App的排行榜系统要求支持实时更新和按时间范围查询”。这种题没有标准答案但答题框架很重要。我当时花15分钟写了三个部分基本覆盖了考察点。存储选型榜单数据用Redis的ZSet存储分数是播放量member是歌曲ID。ZSet天然支持按分数排序和范围查询复杂度O(log n)适合读多写少的排行榜场景。数据同步播放量不能每次直接写Redis先用MQ异步削峰由消费者批量更新Redis避免大促时Redis被写挂。同时定期把Redis数据异步刷回MySQL做持久化防止Redis宕机丢数据。分片与降级如果单ZSet过大按照歌曲id哈希分片每个分片独立一个ZSet查询时多key合并再Top N。如果Redis压力过高直接走本地缓存做降级返回上一次的缓存结果。简答题的核心不是考察你方案多精妙而是看你会不会结构化拆解问题、有没有后端常识。即使你答得不够完善但只要把存储、缓存、异步、容灾这几个关键词都牵出来面试官对你的整体印象就不会差。5. 常见问题与笔试避坑实录这一节是我最想写给你们的因为我身边真的有人因为这些问题和面试机会擦肩而过。笔试本身已经很残酷了这些坑能少踩一个是一个。5.1 选择题卡壳标记跳过不要恋战单选题20题限时20分钟平均一题1分钟。如果你在一道题上卡了3分钟以上大概率是知识点盲区再想也想不出来果断标记跳过。不定项更危险错选不得分少选得部分分所以拿不准的选项不要选。我自己吃过亏一道不定项有5个选项我确定3个剩下2个靠猜结果猜错一个整题0分。宁可只选确定的3个至少拿一半分。5.2 本地IDE跑通粘贴到牛客就编译失败这种情况太常见了。原因一般是这几个用了非标准头文件比如bits/stdc.h在部分老编译器下有问题、使用了C17语法而牛客只支持C14、数组长度是变量导致VLA在GCC下才能编译。解决办法考前用牛客的模拟题环境做一次完整的输入输出测试别只在本地IDE舒服惯了。我后来养成一个习惯写完代码后顺手把不用的头文件删掉数组改为固定长度或用vector尽量兼容更多编译器。5.3 编程题“有思路”但没AC分数被大打折扣很多人以为编程题只要写出大概代码就有分其实不然。牛客的判题是跑测试用例做法错误就是0分部分通过可能给少量分但绝对不会因为你“思路对”就给同情分。所以考前一定要练到“提交一次通过”的准确度。一个很实用的练习方式是每题AC之后再想一想边界条件数组为空、只有一个元素、元素相等、整数溢出把这些边界害死人的点写进代码里。考试时如果有一道题写完但不确定可以花两分钟构造边界测试用例验证比干瞪眼强。5.4 时间分配失控编程题没时间写完这是最惨的结局。我采用的策略是刚拿到卷子先花1分钟把所有题目都扫一遍编程题先挑简单的做。如果两道编程题难度都不低先写一个暴力解保底拿到30%到50%的分数再逐步优化。千万别一上来就挑战难题结果简单题都没时间写。笔试是择优不是竞赛满分只要能保证自己会的都拿到分就已经能跑赢大多数人了。6. 从笔试复盘到offer后端开发学习路线怎么走笔试挂掉不可怕可怕的是挂了之后不知道差距在哪。我秋招期间复盘了三次笔试最后总结出一条清晰的复习路径。如果你现在正处在“好像什么都学过但做题啥都不会”的阶段这条路线可以直接抄作业。6.1 校招后端开发的核心技能栈后端开发不等于“会写Java、会用Spring”。从笔试和面试的反推来看核心技能栈是这三层第一层计算机基础。数据结构、操作系统、计算机网络、数据库原理。这一层是笔试选择题的基本盘也是面试八股文的主战场。没有这一层后面都是空中楼阁。第二层后端通用技术。Linux基本操作、进程线程、TCP/IP协议、MySQL和Redis。这是后端开发的通用零件不管去哪个厂都要掌握。第三层业务技术栈。比如Java体系的Spring Cloud、Go的Gin/微服务框架、消息队列、容器化等。这一层一般是进组之后由具体业务决定在校招阶段要求不会太高但至少要有项目经验支撑。很多人一上来就刷八股文、背框架结果笔试选择题里最基础的时间复杂度分析都做不对本末倒置了。6.2 笔试前一个月的高效复习法如果你是冲刺型选手一个月完全够用。我的经验是把时间切三块第一周刷数据结构和算法题。重点是栈、队列、链表、二叉树、排序、二分、贪心、DP。刷题量每天3到5题但每题都必须自己AC不AC不算过。第二周背计算机基础八股文。操作系统和网络这两块没有诀窍就是反复看直到你能不看书复述“TCP三次握手为什么不能两次”和“进程和线程的区别”。数据库重点看索引、事务、隔离级别这三大块是笔试命题重灾区。第三周模拟笔试实战。上牛客找往年真题严格按90分钟计时做题。多练几次你会找到自己的做题节奏。考前两天不刷难题只看错题和总结笔记。6.3 笔试后的复盘别急着投下一家先把错题消化掉秋招期间我见过很多同学考完一场就马上投下一家错题从来不看结果笔试挂了一模一样的知识点。正确做法是考完当天趁记忆还热把不确定的选择题和没写出来的编程题整理出来逐个查漏补缺。我当时建了一个“错题本”的文档记录每一场笔试的失分点和对应知识点每周滚动复习一次。秋招后期我选择题的正确率明显比前期高就是靠这个笨办法堆出来的。最后再分享一个小技巧。笔试前夕把常用的算法模板整理到一个文档里包括二分模板、并查集模板、快速幂模板、树的前中后序遍历非递归写法。考前一小时快速扫一遍进考场时心里特别有底。这些模板在编程题里直接套用能节省大量手写基础代码的时间。祝你们都能扛过笔试这关我们面试环节见。