
又到了一年秋招季陆续有读者在后台问我vivo算法岗的笔试怎么准备趁着记忆还热乎我把2024年秋招vivo算法类笔试的完整复盘整理成文。这篇内容涵盖我对整套笔试题型的拆解、核心考点的详细解析、刷题路线规划以及现场实战的坑位避雷目标是让接下来准备vivo或其他大厂算法岗的同学能有一份可以直接照着走的行动清单而不是漫无目的地刷题。先说结论vivo的算法类笔试整体风格偏“稳”不会像互联网大厂那样动不动就甩一道压轴ACM难题但覆盖面非常广数据结构、机器学习、深度学习都有涉及而且非常看重基础概念的扎实程度。这意味着如果你只是会调库而说不清原理或者只会背题而不会推导分数会很难看。1. 笔试内容整体定位vivo算法岗在考什么1.1 算法笔试的筛选逻辑不是考你会不会是考你有多熟练很多同学对笔试有一个误区觉得算法题就是智力题刷题靠“灵感”。但真实的大厂笔试包括vivo在内筛选逻辑完全不是这样。笔试环节的定位是让你从几千份简历里脱颖而出进入面试。所以它考察的核心不是你“能不能做出来”而是你在有时间和环境压力的情况下“能做得多快、多准、多稳”。一道题如果在平时给你半小时慢慢想你可能能做出来但笔试时每题只有两三分钟到十分钟不等的平均时间加上机试环境的压力真正起作用的是你的“肌肉记忆”——看到什么题型立刻能判断出用哪种算法思路然后快速写出正确代码。vivo的算法类笔试尤其如此题目难度中规中矩但时间紧张一道题如果没有形成条件反射很容易卡住一卡就是十几分钟后面的题就全毁了。所以我的建议是准备vivo笔试先调整心态这不是一次“智力检测”而是一次“熟练度验收”。你刷题的目标不是见多识广而是把最常见的一批算法题练到闭着眼也能写出来。1.2 vivo笔试的题型分布与命题风格我结合2024年秋招的真题反馈以及前两年的笔试情况把题型分布整理成了下面这个表方便你对照检查自己的准备情况题型模块常见考察方式题量占比约难度定位数据结构基础数组、链表、栈、队列、哈希表25%偏简单考基本功基础算法排序、二分、双指针、贪心25%中等考察思维敏捷度高阶算法动态规划、图论、字符串匹配20%中等偏难拉开差距机器学习/深度学习概念题、损失函数推导、模型选择20%中等理论扎实者占优数学/逻辑概率、组合数学、智力题10%中等考临场反应从命题风格看vivo的算法笔试有几个特点比较明显第一字符串相关的题目出现频率高比如KMP算法、正则匹配、最长公共子序列这类。第二动态规划必考而且常常不是裸题会包装成“背包问题变种”或者“路径规划”的场景。第三机器学习部分偏向基础概念的辨析比如过拟合的处理方法、损失函数的特性、聚类算法的适用场景等。这种出题思路某种程度上反映了手机厂商算法岗的真实工作状态你不仅要会写代码实现功能还要理解算法底层的数学原理因为很多场景需要针对具体硬件和产品场景做算法定制优化而不是直接套用现成模型。2. 核心考点拆解数据结构与基础算法怎么准备2.1 排序与查找最容易被忽略的送分题排序和查找是所有算法题里最基础的部分但也恰恰是很多人在笔试时翻车的地方。原因很简单平时开发都用Arrays.sort()手写快排的机会几乎没有真到了笔试要你实现或者分析复杂度的时候反而会犹豫。vivo笔试里排序相关的题目通常有两种考察方式一种直接让你手写实现某种排序算法比如快排、堆排或者归并另一种是给你一段排序代码让你分析时间复杂度或者找出其中的bug。我来分享一个我自己的准备方法把七种常用排序冒泡、选择、插入、希尔、归并、快排、堆排全部手写一遍并且要能说明每个算法的稳定性、时间复杂度和空间复杂度。尤其是快排必须掌握两种写法递归版和迭代版。企业笔试里考快排很多时候不只是考你排序逻辑而是考你对递归和栈调用的理解。注意快排的partition函数写不好后面很多用分治思路的题目都会受影响。务必要把单路快排和双路快排的模板代码写熟练这是基本功中的基本功。查找类题目以二分查找为核心。vivo比较喜欢考“二分答案”的题型也就是不是对数组做二分而是对结果值域做二分比如“在给定时间内最多能完成多少任务”这种场景。这类题的核心是写好check函数二分边界条件是最大的坑建议把 while (left right) 和 while (left right) 两种模板都准备好根据题目情况灵活切换。2.2 字符串算法KMP是必考项重点在next数组字符串算法的出镜率在vivo笔试里非常高尤其是KMP。热搜词里那句“在KMP算法中对于模式串 pabacaba其next数组的定义”其实已经透露了考察方向——vivo确实喜欢把KMP的next数组单独拎出来考。我建议大家别只背模板要把next数组的推导逻辑彻底搞懂。next[i]的定义是模式串中前i个字符组成的子串的“最长相等前后缀长度”。听起来抽象举个例子就清楚了对于 p abacabanext[0] 通常约定为 -1 或 0看具体实现next[1]前1个字符是a没有真前后缀所以是0next[2]前2个字符是ab前缀a和后缀b不相等所以是0next[3]前3个字符是aba前缀a和后缀a相等最长相等前后缀是1next[4]前4个字符是abac前缀aba和后缀bac不匹配缩短为a和c不相等所以是0next[5]前5个字符是abaca前缀a和后缀a相等是1next[6]前6个字符是abacab前缀ab和后缀ab相等最长相等前后缀是2next[7]前7个字符是abacaba前缀aba和后缀aba相等最长相等前后缀是3所以pabacaba的next数组是 [-1, 0, 0, 1, 0, 1, 2, 3]以next[0]-1的写法。我建议你把KMP的实现代码背下来之后再用五六个不同的模式串手动推一遍next数组直到不看任何资料也能流畅写出。因为笔试不是让你讲思路是让你在有限时间内写出完整代码不熟练就是做不出来。2.3 动态规划与贪心拉开差距的关键模块动态规划一直是算法笔试的分水岭。vivo的笔试里DP题往往不是最难的但一定是最消耗时间的。为什么因为DP题通常代码量不大难在状态定义和转移方程的推导。我总结了几个应付DP题的步骤你在平时练习时就要养成这套思维路径第一步明确状态定义。这一步决定了整个题的走向状态定义错了后面全崩。第二步寻找状态转移方程。多从“当前状态能从哪些上一个状态转移过来”这个角度思考。第三步确定初始化和遍历顺序。这一步最容易错尤其是二维DP遍历顺序直接决定正确性。第四步考虑空间优化。能不能用滚动数组压到一维能省很多内存有时候还能避开某些边界问题。举一个我在笔试前反复练习的经典例子最长递增子序列LIS。# 动态规划解法时间复杂度 O(n^2) def lengthOfLIS(nums): if not nums: return 0 dp [1] * len(nums) for i in range(len(nums)): for j in range(i): if nums[j] nums[i]: dp[i] max(dp[i], dp[j] 1) return max(dp)这道题考的不是你会不会写而是你能不能快速发现它可以优化成O(n log n)的贪心二分解法。如果你在笔试里能写出后者就是一个明显的加分项。贪心算法在vivo笔试中也经常出现特征是题目往往有“最多、最少、最大、最小”这类字眼。做贪心题最重要的是证明贪心策略的正确性。虽然笔试不要求写证明过程但你自己心里要有数这个策略在极端边界情况下是否还成立。区间调度问题、跳跃游戏、分发饼干都是高频题型建议作为重点练习对象。3. 机器学习与AI方向考点算法岗笔试的特色模块3.1 经典机器学习从KNN到集成学习的完整梳理vivo算法笔试和纯后端开发笔试最大的不同就是它会考机器学习的基础知识。这其实是很多刷题选手的盲区LeetCode刷了很多但问到“KNN的k值怎么选”就答不上来了。KNN是高频考点考察角度通常是KNN的算法原理、k值大小对模型的影响、距离度量方式的选择、KNN的优缺点。这里有个易错点KNN是惰性学习算法训练阶段只是存储数据没有显式的训练过程预测时才计算距离所以它的预测时间复杂度是O(n)大数据量下效率很低。另一个必考概念是聚类尤其是K-means。K-means的算法步骤、收敛条件、k值怎么确定肘部法则、对初始中心敏感的问题这些都是选择题或者简答题的高频考点。更深入的还有K-means和DBSCAN的对比比如DBSCAN不需要事先指定簇数能发现任意形状的簇还能识别噪声点这些特性是K-means不具备的。集成学习也是vivo比较爱考的特别是随机森林和XGBoost的区别。如果你是做视觉或NLP方向的可能会觉得集成学习和自己方向无关但这些基础概念在算法岗笔试里属于非主观题不会可以蒙不到。我建议至少把Bagging和Boosting的核心区别记牢Bagging是并行训练多个模型再投票降低方差Boosting是串行训练每个模型根据前一个模型的错误来调整权重降低偏差。注意vivo笔试里机器学习的选择题出题特别喜欢结合具体场景比如“当训练数据量很小、特征维度很高时选择哪种分类器最好”。这种题没有标准答案考的是你对算法特性的理解。备考时不要只记结论一定要能把每个算法的适用场景、优势和缺点说清楚。3.2 深度学习考察方式理论推导和概念辨析并重深度学习在vivo算法笔试里的占比取决于你投的是哪个算法子方向。做视觉的岗位CNN相关必考做语音的岗位RNN/Transformer相关必考通用算法岗则偏向基础理论。我梳理了以下几个高频考点建议逐个过一遍第一反向传播的链式求导。面试官很喜欢让你手推一个简单网络里的梯度更新过程笔试则以选择题为主。重点在于搞清楚梯度是沿着网络反向传播的每一层的梯度等于当前层误差对输入的偏导乘以上一层输出的偏导。第二损失函数。交叉熵损失和均方误差损失分别是做什么的各自有什么优缺点什么时候用哪个。特别注意分类问题用交叉熵而不是MSE因为MSE在配合sigmoid激活函数时容易梯度消失。第三过拟合的应对方法。L1/L2正则化、Dropout、早停、数据增强、Batch Normalization各自的作用和区别。这是一个老生常谈但实实在在的考点vivo笔试里几乎每年都会出现。第四优化器。SGD、Momentum、Adam、RMSprop之间的演进关系以及为什么Adam在实践中经常表现更好。考点通常是Adam结合了Momentum和RMSprop的优点既考虑了梯度的一阶矩也考虑了二阶矩。第五CNN的基础组件。卷积核尺寸和感受野的计算、池化层的作用、stride和padding对输出尺寸的影响。输出尺寸的公式是output_size (input_size - kernel_size 2 * padding) / stride 1这个公式是送分题但不少人因为记错符号而答错。建议你花半小时把kernel1、3、5、7stride1、2padding0、same这些组合都算一遍形成反射记忆。3.3 数学与概率题算法岗的隐形门槛虽然数学题在笔试中的占分不算高但它往往是决定你能不能进面试的关键。因为算法岗的简历普遍优秀笔试阶段大家的数据结构和机器学习题都答得差不多数学题就成了区分度很高的部分。vivo的数学题考察方向集中在概率论和组合数学。典型的题目有抛硬币连续出现正面的期望次数、从n个球里取k个有多少种取法、贝叶斯公式的应用等。我当时的准备方法是把概率论里最核心的几个公式——全概率公式、贝叶斯公式、期望的线性性质、常见分布的期望和方差——全部推导一遍。不要只记结论要会推导。比如泊松分布的期望和方差为什么都是λ推导一遍之后你就不会再忘记了。组合数学方面建议掌握排列组合的基本公式、二项式定理以及常见的计数技巧比如隔板法、容斥原理。这些知识在算法题里也经常用到属于一鱼两吃的考点。4. 实战刷题路线从零备战vivo算法笔试4.1 分阶段刷题计划与资源推荐接下来是很多同学最关心的部分具体怎么刷题刷多少题刷哪些题。我把备战过程分成了三个阶段每个阶段的目标和任务都不一样第一阶段第1-2周打基础。目标是建立完整的知识体系。先把数据结构和基础算法的核心知识过一遍数组、链表、栈、队列、哈希表、树、图、排序、查找、二分、双指针。推荐资源是《剑指Offer》和LeetCode的“LeetCode 75题”系列这两套题覆盖了最核心的题型。这段时间建议每题都认真思考哪怕写不出来也要看题解并理解不追求数量。第二阶段第3-5周专项突破。目标是针对高频考点做强化训练。动态规划每天固定刷3-5道从背包九讲开始然后做最长递增子序列、编辑距离、打家劫舍系列、股票买卖系列。字符串算法集中做KMP和滑动窗口相关的题。图论只做最基础的BFS和DFS以及Dijkstra最短路径。这个阶段的核心是建立题型敏感度看到题目就能大致判断属于哪类问题。第三阶段第6周模拟实战。目标是适应笔试节奏。用LeetCode的“剑指Offer专项突破”和牛客网的“企业真题”板块做套题训练。设置定时器一次做2个小时中间不能翻书、不能查资料完全模拟线上笔试环境。这个环节非常重要因为很多人在平时刷题时习惯性看答案到了真实笔试会不适应。除了LeetCode我还建议多去牛客网刷题。牛客网的题库里有大量真实的大厂笔试真题vivo、华为、OPPO这些手机厂商的题目都能找到。虽然每年的题目不完全一样但出题风格一脉相承提前适应没有坏处。4.2 编程语言选型与模板库建设关于笔试用的编程语言我的建议是哪门语言你最熟就用哪门。但如果你在Java和C之间犹豫我会建议你选Java。vivo本身是做Android起家的Java在后端和Android领域都是主力语言笔试环境对Java的支持很成熟而且Java的API丰富写起来比C少踩很多内存管理的坑。不过不管选哪门语言你都需要提前建设自己的代码模板库。所谓模板库就是把你高频使用的算法核心代码按照固定格式整理好考前反复默写确保在笔试时能快速、无差错地写出来。我的模板库包括快速排序和归并排序的模板二分查找的三种边界写法KMP算法完整实现二叉树的先序、中序、后序、层序遍历图论的BFS、DFS模板动态规划常见的几种状态定义模板背包、LIS、LCS、编辑距离并查集模板前缀和与差分模板每个模板都要做到能一口气写出来不能停顿。我见过太多同学在考场上因为一个简单的BFS模板写错导致整道题白给的。4.3 关于最新技术热点的取舍前面提到了一个热搜词“vivo内部用AI 2天重构2万行Vue项目”。这说明vivo内部确实在推AI辅助研发但这个趋势反映到校招笔试上大概率不会直接考“AI重构代码”这种具体工程话题。笔试会更侧重考察算法的基础能力因为基础能力才是算法工程师的立身之本。对于这个热点的正确应对方式是把它当作面试环节的谈资而不是笔试的准备方向。如果你在面试时能提到“我关注到AI辅助编码的趋势自己在实习中也尝试用AI工具提升开发效率但同时也意识到代码审查和算法设计能力更加重要”这会是一个加分的表达。但在笔试环节不会因为你对AI辅助开发有了解而加分代码写不出来就是写不出来。我建议你把刷题群、博客上关于“某大厂笔试压轴题”的讨论当作查漏补缺的信号而不是焦虑的来源。从概率上看2024年秋招vivo算法类笔试的难度延续了过去几年“基础扎实就能过”的风格并没有出现超纲的怪题、偏题。5. 笔试现场实战细节与排坑实录5.1 线上笔试环境与输入输出的那些坑2024年秋招的vivo笔试依然采用线上笔试的方式这就带来了一系列线下笔试不会遇到的问题我用自己的惨痛经历给你排排雷。第一个坑是输入输出格式。牛客网的笔试系统和LeetCode的答题模式有本质区别LeetCode帮你封装好了函数签名你只需要实现函数即可而牛客网需要你自己处理标准输入输出比如用Scanner读数据用System.out.println输出。很多同学平时只用LeetCode刷题没有练过牛客网这种“从空白开始写主函数”的模式到了考场上就懵了。我的建议是考前至少用牛客网做10道“输入输出练习”题熟悉多组输入的读取方式、字符串分割的坑、以及如何用hasNextLine处理不定长输入。第二个坑是环境限制。线上笔试一般有防作弊措施浏览器会锁定不能切换到其他窗口复制粘贴也可能受限。这意味着你没法像平时刷题一样复制模板代码必须靠手打。所以前面强调的模板库背诵在此时就显得格外重要。第三个坑是时间分配。vivo的笔试时间一般是90到120分钟题目数量在25到35道左右其中编程题大概3到5道其余是选择和填空。我强烈建议你先做选择题再做编程题。因为选择题分值高但单题耗时短先把能拿的分拿到手再集中精力攻克编程题。5.2 编程题提交的正确策略编程题提交有一些反直觉的策略很多人不知道第一即使不能完全解决也一定要写部分解。很多编程题是分组给分的比如能处理小规模数据的暴力解法就能拿到一定比例的分数。不要因为想到的算法不是最优就放弃写代码暴力解往往能救你于水火之中。第二注意题目的数据范围。看到 n 10^5你就应该意识到O(n^2)的算法大概率会超时需要设计O(n log n)或O(n)的解法。看到 n 10^3那O(n^2)的解法是完全可行的。第三提前想好测试用例。写完代码后用题目给的示例验证再自己构造几个边界用例。比如空数组、只有一个元素的数组、全部相同元素的数组、最大值的边界情况。这些边界case往往是笔试里最容易出问题的地方。第四谨慎使用递归。当递归深度超过10^5时Java和C都有爆栈风险。如果你的递归逻辑可以用迭代实现尽量用迭代。如果有题目必须用递归比如树的深度优先遍历也建议在代码开头加一行设置栈大小的语句。下面给你一个快速自查表在提交编程题前过一遍检查项具体内容数据范围是否超出int范围需要用long吗边界条件空输入、单元素、全相同、最大值等case是否考虑时间复杂最坏情况下是否能在时限内跑完递归深度是否存在爆栈风险是否需要改为迭代输出格式是否有换行是否有多余空格数组越界循环中是否可能访问越界索引5.3 复盘笔试结束后一定要做的事笔试结束后不管自我感觉如何第一件事是趁热复盘。我习惯把每道题分三类做标记会做且做对这类题说明已经掌握不需要重复刷但可以把解题思路简记下来方便面试前快速回看。会做但做错了这类题暴露了你的易错点一定要找出错因是边界条件没考虑还是代码写得太急导致bug。用个小本子记录下来面试前翻看。不会做这类题是你后续提升的方向需要花时间搞清楚解题思路并且找到同类题再练几道。笔试复盘往往比刷题本身更有价值因为它能精确地告诉你你和目标岗位的差距到底在哪里。我当年在秋招时每场笔试后都会花至少两个小时复盘这个习惯让我在后续的面试中受益匪浅。还有一个小技巧vivo的算法笔试通过后往往会在几天内发面试通知。面试的时候面试官可能会问你笔试时某道题的思路。所以笔试结束后保留好题目内容复盘时把解法写清楚面试前再回看一遍这会让你在面试中显得特别专业。6. 写在最后一些过来人的真心话每年的秋招都会有人问我同样的问题现在刷题还来得及吗我的答案都一样来得及但需要立刻行动。我自己在准备校招的时候也经历过一段“打开LeetCode却不知道从哪做起”的迷茫期。后来我给自己定了一个很笨但有效的规矩不管当天有什么事必须完成三道题才能休息。状态好就做难题状态差就做简单题但绝对不能断。坚持一个月后我发现自己对题型的敏感度有了质的变化从看题三分钟没有思路变成了一看到题目就能迅速定位到“这类题是动态规划那类题是二分查找”。vivo的算法笔试说到底不是一场拼智商的天才选拔而是一场拼准备的耐力测试。把基础算法练扎实把机器学习的关键概念理清楚把常见题型的思路变成条件反射你就已经超过了大多数竞争对手。最后再分享一个我踩过的坑笔试那天记得提前测试好自己的设备。我当年有一场笔试因为笔记本音频驱动出了问题导致在线监考环节无法正常开启白白浪费了十五分钟。这些小细节往往才是决定成败的关键。