
2023年vivo秋招算法岗第一批笔试复盘说实话vivo这批笔试比我预想的要扎实。本来以为互联网厂商的算法岗笔试会集中在深度学习、模型优化这些方向上结果拿到卷子发现数据结构与算法的基础题占了相当比重机器学习相关的内容也有一小部分整体风格偏基本功 思维灵活性不是那种靠背题就能过的套路卷。我参加的是2023年vivo秋招算法岗第一批笔试线上双机位监考时间90分钟题目量大概是4道编程题加若干选择题。编程题里有两道让我印象很深一道是KMP的next数组推导另一道和贪心策略有关。选择题则覆盖了排序算法复杂度、粒子群优化原理、KL散度这类经典考点。这篇文章就把我这次笔试的完整经历、题目复盘和备考心得整理出来给后面准备vivo或其他厂商算法岗笔试的同学做个参考。1. 笔试基本盘与考前的三件事先说整体情况。vivo的秋招笔试一般通过牛客网或赛码网进行双机位手机需要放在侧后方45度角的位置电脑屏幕全程录制。我是提前15分钟进入考场做完环境检测后等待开题。试卷结构是单选题 编程题单选大概10道每道2分左右编程题4道分值不等总分100分。时间90分钟说实话时间不算宽裕尤其是有两道编程题需要仔细推导边界条件。考前三件我认为最重要的事这里提前说第一熟悉笔试平台的操作。很多人忽略这点但实际操作中牛客和赛码的代码编辑器有细微差别比如缩进处理、是否支持本地IDE粘贴、是否有自动补全。我建议提前一天在目标平台的模拟环境里做两道题纯粹为了适应编辑器手感。笔试当天心态已经够紧张了不要再在环境上浪费时间。第二把常见算法的模板代码重新过一遍。这不是让你去背题而是把快排、归并、二分、KMP、拓扑排序、Dijkstra、并查集这些基础算法的标准写法再敲一遍确保手写时不出低级错误。vivo这批真题里KMP直接出现在选择题中而且是next数组的具体推导如果你只是知道KMP思想但没手算过next数组这道题基本只能靠蒙。第三不要死在选择题上。选择题分值虽然不高但覆盖面很广包括排序算法的时间复杂度、贪心算法的适用条件、粒子群算法中速度和位置的更新公式等。这些知识点听起来基础但如果你长期只刷LeetCode而忽略了理论沉淀选择题反而容易失分。我就是考前突击了一下这些经典算法原理结果选择题里至少有两道直接靠这个拿下了。2. 选择题考点扫描高频知识点与两道印象深刻的原题选择题具体题目我记得不完全了但考点类型非常典型。下面这张表是我根据记忆整理的高频考点基本覆盖了这批笔试选择题的80%考点类别具体内容出现频次排序算法快排、堆排、归并的时间复杂度与稳定性2字符串匹配KMP算法next数组推导1智能优化算法粒子群算法PSO速度与位置更新公式1动态规划状态转移方程辨析1机器学习基础KL散度是否对称、ELBO推导2树与图拓扑排序、Kahn算法1经典算法贪心算法适用场景、Dijkstra复杂度2其中KMP那道题是这样的给模式串pabacaba要求计算next数组next[i]定义为失配时模式串回溯的位置通常取最长公共前后缀长度。这个推导需要动手画一遍。以abacaba为例next[0] -1或0具体看定义版本next[1]前缀a最长公共前后缀长度为0next[2]前缀ab没有公共前后缀为0next[3]前缀aba最长公共前后缀为a长度1next[4]前缀abac没有公共前后缀为0next[5]前缀abaca最长公共前后缀为a长度1next[6]前缀abacab最长公共前后缀为ab长度2next[7]完整字符串abacaba最长公共前后缀为aba长度3所以next数组为[-1, 0, 0, 1, 0, 1, 2, 3]以-1开头版本。如果你之前只是看过KMP的概念而没有自己推导过这种题目很容易算错因为aba到底算不算abacaba的公共前后缀需要仔细比对。粒子群算法那道题考的是速度更新公式v w*v c1*r1*(pbest - x) c2*r2*(gbest - x)。它问的是公式里三个分量分别代表什么。w是惯性权重c1是认知学习因子个体经验c2是社会学习因子群体经验r1和r2是随机数。这道题属于经典理论记忆只要复习过PSO原理基本白给。还有一道关于排序算法稳定性的单选问哪些排序是稳定的。稳定排序包括归并排序、插入排序、冒泡排序和基数排序不稳定排序包括快排、堆排、选择排序和希尔排序。这题纯记忆但容易混。整体来看选择题覆盖了数据结构、算法设计、机器学习和智能优化四个方向反映出vivo对算法岗候选人的预期是知识面广、基础扎实。这也提醒我们准备算法岗笔试不能只看编程题理论概念的复习同样重要。3. 编程题复盘四道题目的完整思路与代码编程题是这次笔试的重头戏。4道题里难度梯度比较明显从简单模拟到中等偏上的贪心和动态规划都有涉及。下面按我记忆中题目的类型逐一复盘。3.1 第一题数组去重与排序签到题这道题大概是说给定一个整数数组要求去除重复元素后按降序排列输出。属于最基本的题目可以用HashSet去重再排序或者直接用TreeSetJava天然保持有序。我当时用的Python代码很简洁def solve(arr): return sorted(set(arr), reverseTrue)这种题关键是要快、要稳不要在这种题上浪费过多时间。注意输入可能是多组测试数据记得处理完整的输入输出循环。3.2 第二题贪心 - 活动安排问题变体这道题的具体题目是给定N个任务的开始时间和结束时间每个任务都有一个收益要求选择一组互不冲突的任务使得总收益最大。这个看起来像带权区间调度问题但实际上有个简化的条件就是每个任务的持续时间都相同。这个简化条件很关键。如果所有任务持续时间相同那么任务之间是否冲突只需要看开始时间之差是否小于持续时间。典型的贪心策略是按开始时间排序然后用优先队列维护当前已经选中的任务的结束时间如果新任务与已有任务冲突则替换掉收益最小的任务或者结束时间最早的任务具体看问题要求。我当时实现的是这类问题的经典解法import heapq def solve(tasks): # tasks: list of (start, duration, profit) tasks.sort(keylambda x: x[0]) pq [] # min-heap存储 (end_time, profit) total 0 for start, dur, profit in tasks: # 如果有任务已经结束出堆 while pq and pq[0][0] start: total - pq[0][1] heapq.heappop(pq) # 尝试加入当前任务 heapq.heappush(pq, (start dur, profit)) total profit return total当然这个代码只是我当时的实现思路不同变体的逻辑会有差异。但核心是贪心问题要证明每一步局部最优能推出全局最优而不是凭感觉直接写。这道题如果没注意到持续时间相同这个条件很容易误判为加权区间调度问题然后进入完全不同的解法路径。3.3 第三题二进制字符串问题这道题我记得很清晰因为和异或运算有关。题目大致是给定两个二进制字符串a和b长度相同每次操作可以将a的某个子串中的所有0变成1、1变成0即异或一个全1的掩码问最少需要多少次操作才能让a和b相等。这个题本质上是区间异或问题。将问题转化为定义一个差分数组diff[i] a[i] ! b[i]我们想用最少的区间翻转操作使整个diff数组全为0。由于一次区间翻转相当于在差分数组上修改两个位置diff[l] ^ 1, diff[r1] ^ 1所以问题进一步转化为diff数组中1的个数除以2就是最少操作次数。要注意的是这里的区间翻转到底是只能翻转连续段还是任意子序列题目描述有细节区别。我当时确认了是连续段翻转所以直接统计相邻变化点即可。陷阱在于如果diff数组不是连续成对出现而是交替出现结论会不同。这个题考察的是对异或操作的建模能力。如果你能把实际问题抽象成差分数组基本就能秒杀。如果只是暴力模拟大概率超时。3.4 第四题动态规划 - 最长递增子序列LIS的变形最后一道编程题是LIS的变形。原题大意是给定一个数组需要将它分成若干个子序列每个子序列内部都是递增的问最少能分成几个这样的子序列。这个问题的本质是最长递减子序列的长度Dilworth定理。对于序列[3, 1, 4, 1, 5, 9, 2, 6]最少的递增子序列数量等于最长非递增子序列的长度。因此可以用经典的LIS算法改造一下用二分法求最长非递增子序列长度。我用的代码如下import bisect def solve(arr): # 求最长非递增子序列长度实际上是贪心 二分优化 tails [] for x in arr: i bisect.bisect_right(tails, x) # 找到第一个大于等于x的位置 if i len(tails): tails.append(x) else: tails[i] x return len(tails)这里关键在于理解为什么是bisect_right而不是bisect_left。因为非递增序列允许相等所以相等的元素可以放在同一组里因此要取bisect_right。如果你使用LIS的标准写法很容易在边界条件上栽跟头。这道题整体难度中等考察的是对经典DP问题的深刻理解和变形能力。4. 机器学习与深度学习笔试中不容忽视的算法岗底色虽然vivo算法岗笔试的主体是数据结构与算法但机器学习相关概念的选择题也是重要组成部分。这反映了算法岗和普通开发岗的本质区别——你不仅要会写代码还要理解算法的数学原理和适用场景。我印象比较深的有两道题一道是关于KL散度的。题目问KL散度是否对称以及KL散度是否为0的条件。答案是KL散度不对称即KL(P||Q) ! KL(Q||P)只有在PQ时KL散度为0。这是机器学习基础中的基础但很多人只记得公式忘了这个重要性质。如果题目再深入一点问KL散度是否为一种距离度量答案是否定的因为它不满足对称性和三角不等式。另一道题和ELBOEvidence Lower Bound有关。题目大概是问VAE中ELBO的推导和组成。ELBO等于重建似然的期望减去KL散度正则项。公式是log P(x) E[log P(x|z)] - KL(Q(z|x) || P(z))这在变分推断里非常基础如果系统学过VAE原理这道题基本是送分题。但如果只是调用库函数做深度学习而不了解数学原理就会卡住。关于机器学习的备考建议我觉得要点是不要只看理论也不要只调库而是要把经典的推导自己动手演算一遍。比如LR的损失函数求导、Softmax的反向传播、SVM的拉格朗日对偶、贝叶斯公式在朴素贝叶斯中的应用这些都是笔试选择题的高频来源。vivo作为手机厂商其算法岗涉及到的业务场景包括影像算法超分、降噪、HDR、端侧AI模型压缩、量化、推理优化和推荐搜索等因此对机器学习基础的要求比较高。另外有一道题考了正则化L1 vs L2的区别。L1正则化会产生稀疏解因为它等价于在权重上施加拉普拉斯先验L2正则化不会产生稀疏解等价于高斯先验。这种题在算法岗笔试中几乎年年出现属于必背内容。5. 踩坑清单这些细节让我差点翻车笔试过程中有几个坑我觉得值得提醒后续的同学们。5.1 平台编辑器没有代码补全和本地IDE不同笔试平台的代码编辑器非常朴素没有自动补全没有语法高亮有些平台有但很弱也没有方法签名提示。这意味着你写代码时要把所有import语句、语法结构写完整。如果你平时重度依赖IDE的自动补全考前一定要提前适应在纯文本框里写代码的节奏。我就是因为习惯了IDE补全在写KMP相关代码时差点漏了next数组的初始化。虽然选择题不用写完整代码但这种肌肉记忆缺失在编程题中非常致命。5.2 边界条件和输入输出格式算法笔试最常见的翻车点就是边界条件。比如数组长度为0、只有一个元素、输入有重复值、数字可能为负等。vivo笔试平台用的是ACM模式不是LeetCode的函数模式你需要自己处理输入输出。这里说一个血泪教训在线笔试的输入格式有时候很恶心比如某些变量在上下文中出现但实际未使用或者字符串输入包含空格。我建议养成一个习惯读入数据后先打印一遍确认解析正确再写核心逻辑。虽然会浪费几十秒但能避免算法对了输入解析错了的悲剧。5.3 时间分配不要在难题上死磕90分钟4道编程题加10道选择题时间其实比较紧张。我的分配策略是前15分钟快速做选择题不会的先标记跳过不要恋战剩余75分钟先做第1题和第3题相对容易再做第2题贪心最后死磕第4题最后留10分钟检查代码格式第4题如果超过20分钟没有思路果断写一个暴力解法保底。部分分数总比0分好。笔试不是只招满分选手排名靠前就有面试机会。5.4 环境问题网络稳定性vivo的笔试是双机位监控对网络稳定性的要求很高。如果面试过程中网断了监控画面会缺失可能被判作弊。建议用有线网络连接电脑手机用流量避免路由器断网导致双机位同时断线。另外把电脑的休眠功能关掉防止长时间不动导致锁屏。6. 笔试结束后的下一步从笔试到面试的无缝衔接笔试只是第一关vivo算法岗的面试流程通常包括技术面2-3轮和HR面。技术面中面试官会根据你笔试的答题情况深入追问如果你的笔试代码写得不错面试时会被要求现场手撕算法题或者深入讨论笔试中某个题目的优化方案。所以笔试结束后不要急着放松建议立刻复盘。如果你在笔试中遇到一个恰好没做出来的题不要扔到一边而是要搞懂它的最优解因为面试时很可能会被问到。我当时笔试第4题LIS变形虽然用二分法写了但在复杂度分析环节表述得不够清晰结果面试时面试官特意让我用手撕一个LIS的O(n log n)解法并详细解释bisect_left和bisect_right的区别。这个经历极度尴尬但也很幸运至少我知道了自己的薄弱点。另外vivo的算法岗面试对项目经历也有一定要求。笔试考察的是算法能力面试考察的是解决实际问题的能力。建议准备一个完整的机器学习或深度学习项目经历包括数据预处理、模型选择、训练优化、效果评估等完整链路。面试官会更关注你在项目中做了哪些关键的决策以及你如何评估模型的表现。还有一个细节vivo的面试中可能会问到和手机端侧AI相关的场景题比如如何在手机端部署一个实时运行的图像超分模型、如何降低模型功耗。这类题目需要你对模型量化、剪枝、蒸馏等技术有一定了解。笔试结束后如果还有时间建议把这些Edge AI方向的常见方案过一遍。7. 实用建议我的经验和一些值得一练的题目最后结合这次笔试的经验我给准备vivo或其他厂商算法岗笔试的同学一些具体建议。首先是复习内容上建议把以下知识点全部覆盖优先级知识点原因高排序算法时间/空间复杂度、稳定性选择题必考高KMP算法及next数组推导手算能力很重要高动态规划LIS、LCS、背包系列编程题高频高贪心算法区间问题、任务调度编程题高频中图论拓扑排序、最短路径、并查集选择题/编程题都可能涉及中智能优化算法粒子群、模拟退火选择题常考概念中机器学习基础KL散度、正则化、损失函数算法岗必考低深度学习模型CNN/Transformer原理面试环节更可能深入其次是练习建议。LeetCode依然是最高效的刷题平台但要注意笔试中的题目往往会综合多个知识点和LeetCode上那种单一知识点的题不完全一样。建议用牛客网的真题库刷题尤其是企业校招真题更能模拟真实笔试风格。值得推荐的经典题包括LeetCode 300最长递增子序列LeetCode 435无重叠区间贪心LeetCode 28KMP字符串匹配LeetCode 373查找和最小的K对数字二分LeetCode 215数组中第K个最大元素快排变形LeetCode 56合并区间区间贪心最后笔试的发挥和心态关系很大。遇到没思路的题不要慌先把能拿的分数拿到。我在这次笔试中也有几道题不确定但没有影响整体节奏。记住校招笔试是竞争性筛选不是考满分才能过你只需要超过一定比例的竞争者即可。如果条件允许可以找同学一起模拟笔试环境设定90分钟计时在牛客上做一套完整的模拟题。这个操作对适应考试节奏很有帮助。我个人的体会是模拟笔试的经历越多真实考场上就越从容。