尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

腾讯音乐2023春招移动客户端笔试复盘与解题思路

发布时间:2026/9/1 15:10:34

资讯中心
01
ARTICLE

腾讯音乐2023春招移动客户端笔试复盘与解题思路

腾讯音乐2023春招移动客户端笔试复盘与解题思路
3月下旬我参加了腾讯音乐2023年春招移动客户端岗的第二批笔试。腾讯音乐这个招牌不用多介绍旗下的QQ音乐、酷狗、酷我基本覆盖了国内主流的在线音乐用户移动客户端岗主要就是做这几款App的迭代和体验优化。第二批笔试比起第一批能明显感觉到题目风格更稳定、覆盖也更全面从计算机网络、操作系统基础到Java/Kotlin、Android组件原理再到三道编程题基本把我学了两年的东西翻了个底朝天。如果你也是冲着移动客户端方向投的春招或者正在准备大厂客户端岗笔试这篇复盘应该能让你少走不少弯路。我会把题型结构、核心考点、三道编程题的完整解题思路、问答题的答题框架以及我自己在时间分配上的失误逐个拆开讲。1. 笔试概况第二批到底考了什么1.1 题型分布与考试节奏腾讯音乐这场笔试用的是牛客网的在线笔试系统总时长2小时题型分成三大块25道选择题、2道问答题、3道编程题。选择题里20道单选、5道多选问答题和编程题可以自由选择先做哪块系统会有翻页限制但整体流程还算顺畅。题目分布大致是这样的题型数量建议时长考察重心单选题20题20分钟计算机网络、操作系统、Java基础、Android组件多选题5题15分钟容易混淆的细节比如内存泄漏、GC、进程间通信问答题2题20分钟线上问题排查思路、业务场景设计编程题3题65分钟字符串处理、栈/递归、动态规划说实话这个题量不算少2小时满打满算平均每道选择题只有不到1分半钟。我周围几个同学考完最大的感受就是选择做得快编程写得赶。特别是问答题很多人直接跳过了因为问答题没有强制提交但我觉得那部分恰恰是区分度所在我后面会详细讲。1.2 这批笔试的难度定位第二批的难度跟第一批相比整体相当但有一个明显变化基础知识的选择题更偏向常见但容易记错的细节。比如TCP四次挥手的状态变化、HashMap底层在JDK 8之后的树化条件、Activity在异常情况下的生命周期回调顺序这些都是平时开发里天天用、但真要较真时容易翻车的东西。编程题难度梯度比较合理第一题属于签到题认真写基本都能AC第二题是中等偏上的栈应用第三题是动态规划而且加了一个环形条件比裸的线性DP多一个弯。这个梯度设置明显是想筛掉只会背八股文的人——选择题可以靠刷题硬背过关但编程题和问答题如果底子不扎实分数会拉开很大差距。2. 选择题复盘知识点的查漏补缺2.1 计算机网络与操作系统笔试里计算机网络大概占了6-7题操作系统占4-5题这两块是最容易拿分也最容易丢分的基础题。有一道多选问TCP连接释放过程中FIN报文的发送方和状态变化。这个题如果只记了三次握手的流程就容易懵因为很多人把断开连接的四次挥手给忽略了。正确答案里有一个很容易漏掉的细节主动关闭的一方发送FIN后进入FIN_WAIT_1状态收到对端ACK后进入FIN_WAIT_2此时只能接收数据被动关闭方发送完最后一个ACK后进入TIME_WAIT要经过2MSL才真正关闭。选项里把被动关闭方进入TIME-WAIT和主动关闭方进入TIME-WAIT混在一起考察的就是对状态机细节的理解。还有一道关于HTTP状态码的题问504和502的区别。这俩在生产环境里特别常见502是Bad Gateway表示网关或代理服务器收到了无效响应504是Gateway Timeout表示源服务器响应超时。另外301和302的区别也考到了一个是永久重定向、一个是临时重定向缓存行为完全不同。操作系统方面考了两个比较经典的一是死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待问的是哪些条件被破坏后死锁不会发生这是死锁预防的基本思路二是页面置换算法问LRU和FIFO的差别还带了一个Belady异常的判断题——FIFO在增加物理页面数时反而可能导致缺页增多LRU不会出现这种异常。2.2 Java/Kotlin语言与集合框架Java基础在移动客户端岗笔试里占比不低目测有5题左右。这些题不会出得像后端那么深但集合框架和并发是绕不开的。HashMap那道题考了三个点底层结构数组链表红黑树、树化条件链表长度达到8且数组容量达到64、为什么是0.75的负载因子。这里面有个挺容易被忽略的点链表的树化不是只看链表长度数组容量不够64时根本不会树化只是扩容。选项里故意把链表长度达到8就转红黑树当成正确说法放进去很多不看源码的同学就栽了。Kotlin的扩展函数也考了一道问扩展函数在编译后是什么形式。正确答案是变成静态方法第一个参数是被扩展的对象实例。这是因为Kotlin的扩展函数本质上是一个静态工具方法调用时相当于把接收者对象作为参数传进去。如果做过真正的Kotlin开发这个问题很直观但如果只是看过语法糖很容易选成运行时动态绑定方法。2.3 Android专项与移动端开发Android专项的选择题大概有6道是移动客户端岗跟后端岗最大的区别所在。这里考的就不是通用计算机基础了而是真正跟做App相关的知识。Activity启动模式是必考的四种启动模式的定义和适用场景都要清楚。我印象比较深的一道题是两个Activity A和BA启动模式是singleTaskB是standardA通过Intent启动B后再按返回键回退栈里是什么情况这道题考的是singleTask对任务栈的影响A所在的Task会被置于前台B入栈返回时从B回到A再返回退出。如果对singleTask的栈内复用clearTop特性理解不深容易在这里丢分。Handler机制是另一个必考点考得很细问的是一个线程可以有几个Looper、几个Handler。答案是一个线程最多一个Looper通过ThreadLocal实现但可以有很多个Handler。同时Looper.loop()是一个死循环如果没消息会阻塞在MessageQueue.next()而不是耗死CPU。这个设计很多人只知道主线程不能做耗时操作不知道背后是Looper消息循环在驱动一切。多选里还考了一个内存泄漏场景排查四个选项静态Context引用、Handler内部类持有外部Activity、不再使用的Bitmap没有调用recycle、用完后没有关闭的Cursor。这里面Bitmap的recycle其实是个陷阱——在Android 3.0以后Bitmap的内存从native堆转移到了Java堆由GC统一管理recycle()并不是必须的官方甚至不建议手动调用。这道题如果对GC机制了解不深很容易把手动recycle当成正确答案选进去。3. 编程题全解思路、代码与复杂度分析编程题是我这次笔试的重头戏也是我下考场后觉得最有底气复盘的部分。三道题我最终AC了两道第三道在最后5分钟换了个思路才跑通整个过程很紧张但也特别值得复盘。以下是我凭记忆复原的题目和完整解法。3.1 第一题字符串压缩题目描述给定一个仅包含大小写字母的字符串s将连续相同的字符压缩为字符次数的形式例如aabcccccaaa压缩后为a2b1c5a3。如果压缩后的字符串长度不小于原字符串长度则返回原字符串。这道题很友好没有设置复杂的前置条件。我的第一反应是用StringBuilder遍历一遍一个计数器记录当前连续字符的数量遇到字符变化就把上一个字符和计数拼接到结果里。需要注意的是边界情况遍历结束后要手动处理最后一组连续字符空串和单字符直接原样返回。public String compress(String s) { if (s null || s.length() 1) { return s; } StringBuilder sb new StringBuilder(); int count 1; for (int i 1; i s.length(); i) { if (s.charAt(i) s.charAt(i - 1)) { count; } else { sb.append(s.charAt(i - 1)).append(count); count 1; } } sb.append(s.charAt(s.length() - 1)).append(count); String compressed sb.toString(); return compressed.length() s.length() ? compressed : s; }时间复杂度O(n)空间复杂度O(n)。这道题唯一的坑就是压缩后字符串长度不小于原串时返回原串这个条件如果不注意测试用例里类似aabbcc这种压缩后反而更长的case就会挂掉。3.2 第二题简易加减法表达式计算题目描述给定一个字符串表达式s包含数字、、-、括号和空格计算表达式的值。所有操作数都是非负整数表达式没有乘除法。例如(1(452)-3)(68)的结果是23。这题是LeetCode 224基本计算器的变体没有乘除只有加减和括号核心难点在于括号会影响运算符的符号。我一开始用了双栈法操作数栈运算符栈但写着写着发现括号栈的处理很容易出错尤其是当连续多个括号嵌套时状态特别容易混乱。后来我换了一种更简洁的思路用符号翻转。维护一个sign变量表示当前数字前面的符号再用一个栈保存括号外的整体符号状态。遇到(时把当前的sign入栈遇到)时弹栈恢复之前的符号状态。这样每次碰到或-只需要根据栈顶的符号状态决定实际的符号即可。public int calculate(String s) { int result 0; int number 0; int sign 1; ArrayDequeInteger stack new ArrayDeque(); stack.push(1); for (int i 0; i s.length(); i) { char c s.charAt(i); if (Character.isDigit(c)) { number number * 10 (c - 0); } else if (c ) { result sign * number; number 0; sign stack.peek(); } else if (c -) { result sign * number; number 0; sign -stack.peek(); } else if (c () { stack.push(sign); } else if (c )) { stack.pop(); } } result sign * number; return result; }这个解法的时间复杂度O(n)空间复杂度O(n)。我在笔试时一开始用的是双栈法写了一堆case后发现嵌套括号的优先级判断完全绕进去了。换了符号翻转之后代码量直接减少了一半。所以这种题平时的训练一定要多过几遍临场换思路是很浪费时间的。3.3 第三题环形街区打家劫舍题目描述你是一个专业的小偷计划偷窃一条环形街道上沿街的房屋。每间房内都藏有一定的现金影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统如果两间相邻的房屋在同一晚上被闯入系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组nums计算你在不触动警报装置的情况下今晚能够偷窃到的最高金额。例如输入[2,3,2]输出3。环形打家劫舍的核心思路是把环拆成两个线性打家劫舍第一种情况是偷第一间房那么最后一间不能偷可偷范围是[0, n-2]第二种情况是不偷第一间房那么最后一间可以偷可偷范围是[1, n-1]。两种情况的较大值就是答案。public int rob(int[] nums) { if (nums null || nums.length 0) { return 0; } if (nums.length 1) { return nums[0]; } return Math.max(robRange(nums, 0, nums.length - 2), robRange(nums, 1, nums.length - 1)); } private int robRange(int[] nums, int start, int end) { int prev2 0; int prev1 0; for (int i start; i end; i) { int cur Math.max(prev1, prev2 nums[i]); prev2 prev1; prev1 cur; } return prev1; }robRange里维护两个变量prev1是到当前位置为止能偷的最大金额prev2是到前一个位置为止能偷的最大金额。转移方程是dp[i] max(dp[i-1], dp[i-2]nums[i])也就是当前这家不偷和当前这家偷两种情况取较大值。空间方面没有用数组直接把滚动变量降到O(1)。这道题我在笔试时第一次写的时候没处理nums长度为1的边界情况直接跳进了robRange结果数组越界。最后用了一个if提前返回才修正过来。边界条件真的值得考场上多检查两遍这种失误丢分太冤了。4. 问答题思路怎么展示自己的思考深度问答题虽然不强制提交但阅卷的时候能看到加分项尤其是对于移动客户端岗面试官非常看重排查问题的思路和对业务场景的设计能力。这次的两道题恰好一个是线上排查一个是业务组件设计都很有代表性。4.1 线上崩溃排查从日志到修复的完整链路题目大意线上用户反馈App闪退你手里只有一个崩溃日志堆栈如何排查和定位问题我的答题框架分五步第一步看崩溃类型是Java崩溃还是Native崩溃Java崩溃定位到具体类和行号Native崩溃则要结合so库的符号表去分析第二步复现崩溃路径根据堆栈里的业务代码推测用户操作路径必要时接入Debug版本或者通过日志辅助追踪第三步分析崩溃现场的资源状态比如内存、线程、文件句柄判断是不是OOM、线程泄漏或者文件读写异常导致的第四步修复代码并做灰度验证注意崩溃修复的回归测试要覆盖到触发路径第五步发布后持续关注该崩溃的监控指标确认崩溃率降下来。这里面我觉得最重要的是先定性再定位的思路。很多人一上来就奔着堆栈里的那行代码去改但线上崩溃经常会遇到空指针异常根因往往是上游某个接口返回的字段变了而不是null判断本身的问题。所以回答时一定要体现出从表象追根因的意识。4.2 歌词同步组件贴合业务场景的设计题第二题我记得很清楚大意是在音乐App中需要实现一个歌词同步显示组件请描述你的设计方案。这道题跟腾讯音乐的业务高度相关也是移动客户端岗和后台岗区别最明显的一道题。我是从数据-视图-交互三个层面拆解的先说数据层。LRC歌词文本的格式是[mm:ss.xx]歌词内容解析时用正则或split按行切分每一行转成一个LyricLine对象包含time毫秒时间戳和content歌词文本解析完成后按时间排序存入数组。因为行数是固定有限的不需要用复杂的数据结构一个有序数组即可。再说视图层。这是核心。自定义一个LyricView继承View在onDraw里根据当前播放进度找到应该高亮的那一行。由于歌词是按时间排序的定位当前行可以用二分查找寻找第一个时间大于当前进度值的索引然后往前取一行就是当前行。高亮那行的文字使用主题色并且通过平移画布让当前行保持在垂直居中的位置这样观感最好。最后是交互层。要做到进度条拖动需要重写onTouchEvent在拖动时暂停自动滚动松手后根据拖到的位置换算成时间再回调给播放器seek到对应进度。歌词的刷新进度由一个Handler驱动每100ms发一个消息更新一次当前时间同时调用invalidate触发重绘。如果频繁刷新导致UI卡顿可以改成Choreographer的帧回调保证跟屏幕刷新率同步。回答这种设计题重要的是体现出我做过、我踩过坑。我当时还补充了一些细节比如歌词解析要处理空行、重复时间戳、乱码编码歌词滚动动画要考虑从旧行到新行的平滑过渡。这些细节比堆砌高深术语更有说服力。5. 时间分配与应试策略实战中总结的经验5.1 我采用的答题顺序和时长分配我这次笔试的时间分配其实不算成功需要复盘一下。我先是按部就班做选择题用了大约35分钟比预设时长略快但多选里有两道不确定的题耗了比较多时间我当时不甘心反复推断了几次。结果问答题我花了将近25分钟写第一题的排查思路写到第二题歌词组件时发现时间已经过半只能压缩答案长度。后面编程题只剩55分钟左右第一题花了10分钟顺利AC第二题因为第一次用的双栈法写岔了重写花了20多分钟第三题写到一半就只剩15分钟了差一点没调完。如果重新来一次我会调整顺序先花15分钟快速扫一遍编程题把能AC的第一题先做完再集中精力攻第二题拿不准的多选题直接标记先跳过去问答题控制在每题10分钟以内重点写框架而不是长篇大论。说白了笔试是分数导向的编程题一题的分值远比一道单选题高不能在低分题上恋战。5.2 现场应急预案遇到没复习到的东西怎么办考试过程中难免会碰到完全没见过的知识点我这次就遇到一道关于Kotlin协程调度器的选择题选项里涉及Dispatchers.Main、IO、Default的区别。我当时对协程只停留在能写、能跑的水平对调度器的底层切换逻辑并不清楚只能靠排除法猜了一个。我的经验是遇到不会的题先标记、后猜测、不空着。选择题的猜测也有技巧比如Kotlin协程调度器这道题Main切换需要主线程执行、IO用于网络和磁盘操作、Default用于CPU密集计算这些基本常识是可以推导出来的。多选拿不准的选项宁可少选不要多选——多选通常错选不得分但漏选可能得一半分。另外编程题遇到卡壳时一定要先想暴力解法哪怕超时也能拿到部分测试用例的分数。牛客的判题系统是按测试用例比例给分的不是一锤子买卖。你写完暴力法至少能拿到一部分分数总比留着空着强。这也是我第三题差点翻车之后最大的教训。6. 复盘心得与后续准备建议6.1 笔试暴露出的薄弱点考完当天晚上我就做了一次完整的复盘三个薄弱点我记得很清楚。第一个是我对Kotlin协程的底层原理了解不够调度器、结构化并发、挂起函数的编译原理都停留在概念层面选择题一考细节就露馅。第二个是我对Binder的掌握只停留在会用层面笔试里有个选择题问一次Binder调用过程中内存拷贝了几次我虽然知道是1次但对mmap的实现原理解释得不够透彻问答题如果问深一点我可能就答不上来了。第三个是我的动态规划熟练度还是不够第三题在边界处理上花了太久环形DP的拆环为数组思路明明很固定但真正落到代码时还是容易慌。6.2 给后面批次同学的建议如果你也是投腾讯音乐或类似大厂移动客户端岗位我建议把复习重心放在三个地方第一计算机网络和操作系统的基础题一定要做到秒答级别这三十分钟的选择题决定了你是不是能进到后面大题的阅卷池第二代码能力需要每天保持手感LeetCode的字符串、栈、动态规划、链表、二叉树五个类型刷够50题就比裸考强很多尤其是动态规划大厂笔试基本必考一题第三要去了解目标公司的业务场景腾讯音乐旗下有QQ音乐、酷狗、酷我客户端岗很可能出跟音乐播放、歌词、音频相关的设计题提前准备一个自己熟悉的业务组件设计方案答题时会从容很多。最后再分享一下我个人在准备过程中的体会笔试其实就是把两年的积累浓缩到两个小时里考的不只是知识量更是你在压力下的判断力。遇到不会的题果断跳过是一种能力拿到熟悉的题快速且准确地写完也是一种能力。这两点比刷多少道题都更能决定你最终的分数。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。