
又是一年春招季相信不少同学已经在牛客和力扣上刷了几个月题就等着拿一场在线编程考试来检验成果。今天想专门聊聊vivo2020届春季校园招聘在线编程考试这个话题。虽然说的是2020届但这类笔试的底层逻辑、出题规律和备考方法其实非常稳定对现在准备春招、甚至秋招的同学都有直接参考价值。先说结论vivo这场在线编程考试难度在大厂校招里属于中等偏务实的那一档不玩偏题怪题反而很看重基础数据结构和编码基本功。题目量不大但是对输入输出处理、边界条件考虑、时间空间复杂度都有实打实的要求。文章后面我会从考试定位、考点分析、备考规划、实战拆解、考场操作五个维度把整场考试从准备到上场的完整链路讲透。不管你是第一次参加在线编程考试的小白还是已经刷过几百道题的老手这篇内容都能帮你少走一些弯路。1. 先搞清楚这场考试到底考什么1.1 在线编程考试的定位与筛选逻辑在聊题目之前我建议大家先想明白一个问题企业为什么非要用在线编程考试来筛人校招简历投递量动辄上万份技术面试官不可能每个人都在白板上聊一遍算法。在线编程考试最大的价值是能用一套相对标准化的题目快速判断候选人是不是具备能把想法转化为可运行代码的基本能力。vivo内部的招聘流程同样如此笔试环节的目标不是选拔天才而是把候选人分成几个档次能不能看懂题目、能不能设计出可行的算法、能不能在限定时间内写出没有低级错误的代码、能不能处理边界条件。这四个层次正好对应着面试官后续面试时愿意投入的精力。另外要意识到春招和秋招的性质不同。秋招是招聘主战场名额多、岗位全春招更多是补录性质考位和名额通常更紧俏。这就导致春招笔试虽然题目难度未必提升但竞争密度不小每一道题都不能掉以轻心。vivo2020届春季这场在线编程考试我了解到的情况是题目整体不偏但区分度主要在细节上比如数组越界、字符串为空、输入格式不合法这类场景丢分的人非常多。1.2 vivo这类厂商的出题风格与热门考点vivo作为手机厂商对工程师的要求有很强的行业特征。手机系统、相机算法、通信协议、底层驱动这些方向决定了它的技术面试普遍重视内存使用、执行效率、稳定性。反映到在线编程考试里就是题目风格比较实在不会出现那种为了难而难的脑筋急转弯更倾向于让你处理实际工程中会遇到的数据结构和算法场景。从我掌握到的历年题目来看vivo校招在线编程的高频考点集中在下面几个方向数组与字符串双指针、滑动窗口、字符串匹配、子串问题。链表链表反转、合并有序链表、环形链表判断。栈与队列括号匹配、单调栈、循环队列。查找与排序二分查找、快排思想、归并思想、top K问题。递归与深度优先二叉树的遍历、路径求和、排列组合类题目。动态规划背包问题、最长递增子序列、最大连续子数组和、编辑距离。这些考点虽然看起来多但相比互联网大厂动辄出困难级动态规划题目的风格vivo更偏爱经典题型 稍作变形比如把一道排序题包装成根据手机应用使用频率排序的场景本质上还是考你有没有掌握稳定的基础解法。我建议备考时把上面六类问题都覆盖到但优先级可以这样排优先级考点方向说明第一梯队数组、字符串、栈、队列出现频率最高建议每种题型刷透第二梯队排序、二分、链表基本算法素养必须熟练到条件反射第三梯队递归、DFS、简单DP常见于第二道或第三道题建议熟悉套路1.3 考试形式与平台环境vivo2020届春季校园招聘在线编程考试使用的是在线笔试平台一般会提前发邮件通知考试链接和时间段。平台常见的有牛客网、赛码网也有部分场次用公司自研的笔试系统。虽然平台不同但共性很强网页版代码编辑器、在线编译运行、通过标准输入读取数据、要求输出到标准输出。这里要特别提醒第一次参加在线编程考试的同学网页IDE和本地IDE的手感差别很大。本地IDE有代码补全、断点调试、错误提示友好网页IDE往往只是一个带高亮的文本框编译报错信息有时候还很简略。所以备考阶段一定要早一点适应在网页编辑器里写代码至少做过十次以上完整的模拟笔试否则考场上很可能因为找不到方法签名不知道头文件要不要自己写这类问题浪费大量时间。另一个容易踩坑的是输入输出格式。在线判题系统靠比对标准输出判断结果多打一个空格、少换一行、输出顺序不对都会被判错。这些细节我会在后面的实战部分专门展开讲。2. 备考阶段怎么准备最有效率2.1 数据结构与算法的优先级排序很多同学备考时有同一个困惑那么多内容从哪开始刷我的建议非常明确不要按题号刷也不要按题目难度刷而是按知识点优先级刷。以vivo这类厂商的笔试要求来看优先级最低的内容其实是那些偏门的数据结构比如并查集、线段树、Trie树、平衡二叉树、图论的最短路算法这些在普通校招笔试题里出现的概率很低就算出现也往往是压轴题绝大多数人本来就不指望做出来。把时间花在基础且高频的内容上性价比高出很多。我自己给学生的建议优先级是这样的先把数组、字符串、哈希表、栈、队列这五个方向的基础题做到条件反射然后是排序、二分、链表三种经典算法结构再之后是二叉树遍历、递归、DFS、BFS这类套路化内容最后才是简单动态规划和贪心。能把这五层内容吃透应对vivo这场考试的题目已经绰绰有余。注意我特意把简单动态规划放在最后一层是因为动态规划一旦没入门很容易让人崩溃但在笔试里高频出现的往往只是最大连续子数组和爬楼梯背包问题变体这么几类把这些经典模型弄熟就够了不需要一上来就钻研插头DP、数位DP这种竞赛级内容。2.2 编程语言选型与输入输出规范语言选型这件事我在无数场合说过校招笔试最忌讳的就是什么都会一点什么都不熟。你选的语言必须满足两个条件第一是自己最熟悉、最不容易出错的第二是能在笔试平台稳定运行的。以vivo的场景来说C和Java是最稳妥的选择。如果投的岗位偏底层驱动、嵌入式方向用C会更贴合技术栈如果投的是应用开发或者后端方向Java也完全没问题。Python也能用但需要注意运行时间和内存限制某些复杂题在Python下可能超时所以如果你时间充裕我建议至少有C或Java其中一门作为笔试主力。输入输出规范是另一个高频翻车点这里我展开说一下。在线笔试的数据输入通常有几类格式单个整数、第一行给总数后面跟一行数组、多组测试数据直到文件结束、第一行给测试用例组数后面跟着多组数据。每一种格式都要熟记对应的写法。以Java为例// 单个数加一行数组 Scanner scanner new Scanner(System.in); int n scanner.nextInt(); int[] nums new int[n]; for (int i 0; i n; i) { nums[i] scanner.nextInt(); } // 先读组数再循环处理多组 int t scanner.nextInt(); while (t-- 0) { int len scanner.nextInt(); int[] arr new int[len]; for (int i 0; i len; i) { arr[i] scanner.nextInt(); } // 处理一组数据并输出结果 }C的写法差不多用cin读取用cout输出。关键是要记住输出时必须严格按照题目要求比如每个结果占一行就不要输出多余的空行要求以空格分隔同一个用例内多个结果就不要换行。这些细节不在算法能力范围内但决定了你是AC还是WA。2.3 刷题规划与时间安排建议我见过太多同学备考时陷入一个误区每天刷十几道新题看起来非常努力但遇到同类题型换了个问法就不会了。真正有效的刷法应该是以掌握一类解法为单位而不是以刷完一道题为单位。比较合理的规划是这样的如果距离笔试还有六周前两周主攻数组、字符串、哈希表每天做3到5道题做完之后一定要整理出这一类题目的通用模板第三周主攻链表、栈、队列、二分第四周主攻二叉树和递归每天做2到3道中等难度的题第五周集中攻克简单动态规划和贪心最后一周做全真模拟每天按照考试的标准时间完整做一套题并且用网页版编辑器。刷题资源方面我不推荐地毯式刷完整个题库那效率太低。比较实用的组合是力扣热题HOT 100 剑指Offer 牛客网的历年校招真题。力扣HOT 100覆盖面广剑指Offer题目偏经典牛客真题能帮你适应vivo这类厂商的实际出题风格。每道题做完之后花五分钟在笔记里记录三件事这道题的核心考点是什么、最优解法用了什么思想、我第一遍错在哪里。这五分钟的时间投入比多做五道新题还有价值。3. 实战拆解一道高频类型题目的完整推导3.1 题目背景与题意分析为了让大家更直观地理解考场上的思考过程我拿一道在vivo这类厂商笔试里出现频率很高的题目来做完整拆解给定一个整数数组nums找到一个具有最大和的连续子数组子数组最少包含一个元素返回其最大和。例如输入 nums [-2, 1, -3, 4, -1, 2, 1, -5, 4]输出应该是 6因为连续子数组 [4, -1, 2, 1] 的和为 6。这道题的经典包装是LeetCode第53题最大子数组和很多校招笔试都会换个题目背景出现但核心解法完全一致。在考场上读到这里应该马上形成两个判断第一题目要求的是连续子数组不是任意子序列这点决定了能不能排序第二数组元素有负数最大和子数组不一定从0开始也不一定到末尾结束。想清楚这两点才能避免后面写出错误算法。3.2 从暴力到最优的推导过程在笔试现场如果一时想不出最优解可以先用暴力解拿部分分。但我的建议是如果时间允许尽量直接推导最优解。这道题的推导路径非常清晰。最暴力的解法是三重循环枚举子数组起点i终点j再用一层循环从i累加到j时间复杂度O(n^3)。这个解法在n1000时勉强能跑n10000时就直接超时了。优化一层用前缀和数组快速计算区间和。preSum[i]表示前i个元素的和那么区间[i, j]的和就是preSum[j1] - preSum[i]这样只需要枚举起点和终点时间复杂度降到O(n^2)。再往下想能不能遍历一遍就解决问题可以。定义一个状态dp[i]表示以第i个元素结尾的连续子数组的最大和那么对于每个i只有两种选择把nums[i]接到前面的子数组后面或者从nums[i]重新开始。这对应状态转移方程dp[i] max(dp[i-1] nums[i], nums[i])答案就是所有dp[i]中的最大值。以 [-2, 1, -3, 4, -1, 2, 1, -5, 4] 为例dp数组依次是 -2、1、-2、4、3、5、6、1、5最大值是6。这个思路本质上是动态规划时间复杂度O(n)空间复杂度O(n)。笔试现场还可以顺手做一个空间优化dp[i]只依赖dp[i-1]所以不需要保存整个dp数组只用两个变量滚动更新即可。到这一步就是大家常说的Kadane算法。3.3 现场编码与自测细节有了思路之后编码阶段要注意几个实操点。首先确认输入格式题目通常先给数组长度n再给一行n个整数。然后考虑边界情况数组只有一个元素时直接返回该元素数组全为负数时最大子数组就是最大的那个负数上面这个算法的初始化方式能正确处理这种情况因为每次取max(current nums[i], nums[i])时如果current已经是负数从nums[i]重新开始一定不会更差。下面给一份可以直接在笔试平台运行的Java参考写法import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); int[] nums new int[n]; for (int i 0; i n; i) { nums[i] scanner.nextInt(); } int result maxSubArray(nums); System.out.println(result); } public static int maxSubArray(int[] nums) { int current nums[0]; int maxSum nums[0]; for (int i 1; i nums.length; i) { current Math.max(current nums[i], nums[i]); maxSum Math.max(maxSum, current); } return maxSum; } }提交之前建议在脑子里或者草稿纸上至少跑两组用例。第一组是 [-1, -2, -3]输出应为 -1第二组是 [1, 2, 3]输出应为 6。这两组用例能验证全负数和全正数两种极端情况。我在考场上的习惯是每道题写完代码后先花一分钟设计两组极端数据手算一遍再点提交这个习惯帮我避免了很多次无谓的罚时。4. 在线考试当天的操作要点与避坑清单4.1 开考前的环境检查与物品准备在线编程考试和线下考试不一样环境因素对成绩的影响非常大。我见过有同学因为浏览器弹窗、网络波动、摄像头检测失败硬生生浪费了半小时考试时间。提前准备能避免这些问题。考试前一天建议做三件事。第一确认考试链接在哪个浏览器下兼容通常邮件里会注明没有注明就提前把Chrome和Edge都装好面试前都测试一遍。第二检查网络不要用公共WiFi尽量用有线网络或者手机热点作为备用。如果考试系统有摄像头监考要求提前测试摄像头和麦克风是否正常。第三准备草稿纸、笔、身份证件并按系统要求放到指定位置。手机上会有双机位监考的话提前准备一个手机支架确保后置摄像头能拍到桌面和双手。开考前30分钟进入考试系统把无关软件全部退出特别是带弹窗的通讯工具、自动更新的后台程序。我吃过一次亏考到一半系统更新弹窗把代码编辑器挡住了点关闭的时候误触了提交按钮整场发挥严重受影响。这种低级失误靠提前关闭软件就能完全避免。4.2 时间分配与做题顺序策略在线编程考试的时间一般比较紧凑通常90到120分钟做2到3道编程题部分场次还会穿插几道选择题。我的做题策略就一条先通读所有题目再按照让自己先拿稳分的顺序答题。拿到试卷后的前5分钟不要着急写代码先把所有题目都读一遍。标注每道题的预估难度、数据范围、分值和大致思路。然后确定做题顺序先做自己最有把握、分值可控的题目再做思路清晰但代码量大的题目最后做需要更多思考的压轴题。如果你一看某道题就有完整思路那就先写它因为最怕的是第一题就卡住心态崩了后面全乱。下面给一个通用时间分配参考具体可以根据题量调整时间段操作说明开考后前5分钟通读全部题目快速评估难度和分值分布第5到45分钟完成第1道题选择最有把握的题先拿分第45到85分钟完成第2道题合理取舍卡超过15分钟就跳过第85到110分钟完成第3道题或回头补题优先保证能AC的题最后10分钟检查输入输出格式与边界不轻易改代码逻辑只修复明显问题这里特别强调卡超过15分钟就跳过这条原则。在线编程考试和面试不一样面试的面试官会给你提示笔试没有提示卡在一个坑里很可能出不来。与其死磕一道题导致后面全崩不如先做完其他题目等大脑放松几分钟后再回头想很多题当时卡住是因为紧张而不是真的不会。4.3 常见异常情况和处理办法在线考试过程中一定会遇到各种意外把这些情况提前想好真发生了就不慌。我整理了备考群里同学们反馈过的常见问题做了个速查表异常现象可能原因处理办法代码本地运行正常平台编译报错缺少import或头文件或使用了平台环境不支持的语法特性仔细看第一行报错信息补全依赖避免用极高版本特性输出提示格式错误多了空格、多了换行、大小写不一致逐字符比对题目输出示例尤其注意最后一行运行超时算法复杂度过高或输入读取方式低效尝试优化复杂度检查是否用了Scanner逐行读大数据内存超限开过多大数组或DP表尝试滚动数组、减少额外空间开销页面卡死或代码丢失网络波动或浏览器崩溃开考前确认系统是否自动保存遇到问题先截屏保留证据并联系技术支持误触提交按钮操作失误提交前系统一般会弹确认框注意看清楚选项不要用键盘快捷键误触发另外补充一条很多人不知道的经验线上笔试平台一般都有代码自动保存功能但不同平台机制不一样有的只在你手动点保存时保存。所以每写完一题花几秒钟手动保存一下防止浏览器刷新导致代码丢失。这个动作虽然简单但在考场上的价值非常大。5. 编程笔试通过之后还需要做什么5.1 面试环节会怎么衔接笔试通过后紧接着就是面试环节。很多同学以为笔试考完就万事大吉这是个很大的误解。vivo的面试流程里面试官会拿到你的笔试记录包括你写了什么代码、哪道题没有通过、花费了多长时间。部分面试官会在技术面开头直接问笔试第二题你当时的思路是什么有没有想过更优的解法如果你答不上来笔试分数再高也会打折扣。所以在笔试结束到面试开始之间建议做的事是把笔试中做出来的题重新梳理一遍思路把没做出来的题试着补做确保每一道题都能讲清楚算法思路、时间复杂度和空间复杂度。面试阶段还大概率会考察项目经历和基础知识比如Android方向会问Activity生命周期、Handler机制、性能优化嵌入式方向会问进程线程、内存管理、常用通信协议。这些内容不是靠考前突击能解决的需要平时积累。如果时间实在紧张优先准备两部分一个是自己简历上写过的项目每个项目都要能讲清楚项目背景、个人职责、技术难点、最终效果和数据指标另一个是高频基础八股比如Java的HashMap原理、C的智能指针、进程和线程的区别、TCP三次握手为什么需要三次。面试官不要求你背得一字不差但要求你能讲出核心逻辑和自己的理解。5.2 给下一届同学的长期备战线最后想聊点更宏观的东西。如果你现在不是马上要考试而是还在大二或大三我强烈建议不要把校招备考压缩在最后两个月。vivo2020届春季这场在线编程考试的题目虽然不偏但想拿高分依然需要扎实的代码功力和算法思维这些东西靠突击能补一部分但补不了真正的工程能力。长期来看我觉得最有效的路径是这样的大二开始保证每学期至少写两三个完整项目项目不一定要多高级但必须自己真正动手写过核心逻辑。与此同时每周保持三到四天的刷题频率每天不用多两三道即可关键是要持续。大三上学期结束前把力扣HOT 100和剑指Offer刷完第一遍。大三下学期开始做真题模拟每周完整做一两套校招真题严格控制时间和环境。这样到真正参加vivo在线编程考试的时候你面对的只是又一次常规练习而不是一场生死战。说起来有点像是老生常谈但我在实际接触过很多候选人之后发现最终能平稳通过校招笔试的人往往不是天赋最高的那一批而是准备最系统、细节抠得最到位的那一批。在线编程考试就是这样它不考你的小聪明只考你的基本功和稳定性。你能不能在两个小时里稳定输出自己会的东西这个能力本身就是企业最看重的筛选信号。最后再分享一个过来人的小技巧离考试还有不到一周的时候不要再刷新题了把做过的错题和经典模板拿出来反复默写快排、二分、前缀和、最大连续子数组和这四类模板考前三天每天手写一遍。我当年靠着这个习惯在考场上基本没在基础题上浪费过时间。希望看完这篇文章的你也能稳稳拿下属于自己的Offer。