ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

vivo校招在线编程笔试复盘:考点、时间管理与避坑指南

vivo校招在线编程笔试复盘:考点、时间管理与避坑指南 投完vivo的简历那天晚上我一直在想什么时候会收到笔试通知。等真收到“vivo 2020届校招在线编程笔试A卷”的邮件时第一反应不是兴奋而是紧张。因为在线编程这种形式和平时在IDE里写代码完全是两码事——限时、自动判题、本地测试和线上测试可能不一致任何一个环节出问题原本会做的题都可能拿不到分。现在回头看那场笔试其实是我整个校招季里性价比最高的一次练习它逼着我把做题节奏、输入输出处理、边界条件、算法复杂度这些事情全部重新捋了一遍。如果你也准备投技术岗无论你是计算机科班出身还是半路转码这篇复盘都值得花几分钟读完。我会把整场笔试从开考到交卷的完整思路拆开说说A卷里高频出现的考点方向讲讲在线编程平台容易翻车的细节再聊聊考完之后怎样把这套题的价值榨干。1. 2020届校招在线编程A卷的整体结构盘点1.1 一张卷子里到底有什么很多人第一次参加在线编程笔试以为整张卷子全是编程题结果进入考试界面才发现前面还有一批客观题。vivo 2020届校招在线编程笔试A卷在我印象里就是“客观题编程题”的组合。客观题主要覆盖计算机基础数据结构、操作系统、计算机网络、数据库这些方向都会涉及。形式上以单选、多选为主偶尔会有填空题。这里要注意客观题不是背概念那种考法而是偏理解和推导。比如给你一段代码问它的时间复杂度是多少给你一个页面置换算法问缺页次数是多少或者给两个并发进程问你互斥与同步的结果。这种题靠考前突击背概念用处不大考的是平时积累和课堂上的理解程度。编程题的数量一般在1到3道之间题量不算大但每道题都自带多个测试点整体判题比较严格。整场考试的时间通常在60到90分钟部分岗位可能略有调整。实际体感是时间非常紧张尤其是第一次使用在线判题系统的同学光适应编辑器、调试输出、手动造测试用例就会花掉不少时间。1.2 分卷机制和它对备赛的影响稍微有经验的校招选手都知道在线编程笔试经常有A卷、B卷甚至C卷。这不是为了制造难度差异而是为了防止同一场考试中出现作弊或泄题。不同试卷的题目顺序不同部分题目内容也不一样但整体难度会控制在相近的水平线上。vivo 2020届校招在线编程笔试A卷就是这套分卷机制里的其中一套。分卷机制对考生有一个直接的影响你在网上搜到的“别人那场笔试考了什么”未必和你抽到的题完全一致但题型特征、考点分布、难度梯度和出题习惯是有参考价值的。所以我建议准备阶段不要迷信“原题”要把精力放在“这一类题怎么解”上。见到原题最多让你节约一点读题时间真正决定分数的是你面对一道新题时能不能快速找到思路并且把代码写到能通过全部用例的程度。1.3 时间分配客观题与编程题之间的博弈以90分钟为例合理的分配思路是客观题控制在30分钟以内编程题留至少50分钟。如果客观题里有一道计算量大的题卡了3分钟还没有清晰思路不要死磕先选一个可能有分的选项标记一下等编程题做完再回头斟酌。编程题之间也要有优先级。如果三题里明显有一道比较简单就把它放在最前面做先把稳的分数装进口袋。我当时给自己定的规则是每道编程题最多花20分钟超过这个时间还没有完整思路立刻转去做下一道。因为在线判题是按通过用例数给分的把时间花在“最容易拿分”的题上总分才最划算千万别跟某一道题较劲较到交卷。2. 编程题出题最爱用的几个方向2.1 字符串处理与格式转换基础中的基础从大环境来看在线编程笔试的编程题基本绕不开字符串处理。vivo这套A卷也一样字符串相关的题大概率会出现。这类题看起来简单实际做起来却很容易翻车。原因在于字符串题的细节非常多输入里可能有空格、有大小写、有特殊符号输出格式要求也可能很严格差一个空格都可能导致判题失败。举个常见的例子题目要求统计一个字符串中出现次数最多的字符并输出它和出现次数。看起来很简单对吧但题目里可能会藏这些条件字符串包含空格、大小写是否合并、出现频率相同时按什么顺序输出。不把条件读清楚直接开写代码很容易在测试用例里踩坑。所以字符串题最重要的不是急着写而是先把“输入是什么、规则是什么、输出格式是什么”三个问题搞清楚。2.2 状态模拟题最考验细心第二种高频题型是逻辑模拟题。题目会给你一个业务场景或操作序列要求你用代码模拟整个过程。典型例子包括给定一系列指令求某个变量的最终值给定一组物品和规则判断哪几个物品符合条件或者模拟一个队列的进出过程。这类题考的不是算法深度而是代码实现的准确性。你要保证代码覆盖了每一种分支情况不漏掉边界不写错循环条件。很多同学在本地跑示例没问题一提交就有一两个用例不过通常就是分支条件考虑少了。模拟题建议用“状态机”的思路来做把整个流程拆成几个状态每个状态写清楚入口和出口比一口气写一大段if-else要稳得多。2.3 简单动态规划与贪心拉开差距的题在vivo这一类校招笔试里真正能拉开分数差距的往往是一道简单或中等级别的动态规划题偶尔也会涉及贪心。常考的DP模型包括背包问题、最长递增子序列、路径计数、最小花费爬楼梯以及一些状态转移特别直观的题目。学过算法的人看到这些题会觉得很常规没刷过题的人则容易直接愣住不知道从哪里下手。以“路径计数”为例在一个m行n列的网格里从左上角走到右下角每次只能向右或向下问有多少种不同走法。这个题的DP方程很经典dp[i][j] dp[i-1][j] dp[i][j-1]初始化第一行和第一列为1。如果没有提前接触过这类题现场要自己推导出这个方程不是完全不可能但会很费时间。所以准备校招笔试DP这块的基本功一定要提前补齐。2.4 高级算法题到底会不会考常有同学问我要不要花大量时间准备网络流、线段树、平衡树、后缀自动机这些高级数据结构。我的看法是在校招在线编程笔试这一轮通常不会考到这么难。原因是这类笔试的目标是海量筛选考察的核心是编程基本功、逻辑思维和基本的算法素养不是选拔ACM选手。如果题目难度一开始就到了竞赛级别那筛选效率反而会下降。所以复习的时候不要被极端难题吓到也不要把全部时间押在偏难怪题上。真正值得投入精力的排序是数组、字符串、链表、栈、队列、哈希、递归、二分、贪心、简单动态规划、基础图论。把这些板块吃透应付在线编程笔试已经绰绰有余。3. 现场做题顺序与时间管理方式3.1 拿到试卷先花三分钟通读拿到卷子之后不要着急冲进第一道题。我习惯先花三到五分钟把整张卷子快速浏览一遍看清楚客观题有多少道、编程题有几道、每道编程题大概考察什么方向。通读的过程中我会按“易、中、难”给编程题做一个初步标记再决定后面的做题顺序。这一步的意义在于你需要在第一时间建立起对全局的掌控感。如果整张卷子总体偏简单那每一分都要争取如果总体偏难就要学会取舍保证会做的题拿满分不会做的题争取部分分。盲目的从第一题做到最后一题很容易出现“难题卡太久、简单题没时间做”的尴尬局面。3.2 客观题不恋战客观题部分我的策略是严格限时。每道选择题如果读完题目没有思路或者要算很久就先标记一个选项然后直接跳到下一题。等编程题全部做完如果还有剩余时间再回来慢慢算。有人可能会担心这样乱选会不会吃亏实际上在线笔试的客观题通常不是负分制猜一个答案的期望值并不低。而且把时间留给编程题往往能多拿下一两个测试用例的分数相比之下放弃某一道客观题简直不值一提。我见过太多同学在一道计算题上纠结了十几分钟导致最后一整道编程题空白交卷这种损失是致命的。3.3 编程题从最有把握的开始编程题的做题顺序我推荐“先中后易再难”。为什么不是先做最简单的那道因为有些简单题代码量反而很大属于体力活需要耐心而中档题通常思路清晰实现正确率高是整卷的稳定得分点。先把这类题拿下心态会稳很多。做编程题的时候我会在正式敲代码前先花两分钟在草稿纸上写一下思路输入是什么、输出是什么、需要用哪种数据结构、核心循环怎么写。思路想清楚再动手写代码会非常顺畅。反过来拿到题就开始敲很容易写着写着发现逻辑漏洞最后反复改浪费时间又影响心情。3.4 最后五分钟的自测检查考试最后五分钟不管题目做没做完都要强迫自己停下来做一轮快速自测。检查三件事第一代码里是否有拼写错误变量名有没有用乱第二默认示例能不能正确跑过第三有没有忘记处理空输入或单元素输入。这五分钟看起来不起眼却经常决定一道题是满分还是零分。我印象特别深有一次在练习中代码逻辑完全正确但因为Scanner没有关闭、控制台一直等待输入导致超时判负。从那以后我养成了“代码写完后必须手动跑一遍示例”的习惯这个习惯在正式笔试里救了我好几次。4. 在线编程平台最容易翻车的三个细节4.1 输入输出格式没搞懂算法再对也没用在线编程笔试和LeetCode这类平台有一个很大的区别很多校招笔试系统不会自动帮你封装好函数而是要求你自己处理标准输入输出。你需要根据题目描述自己读取输入按照指定格式输出结果。如果输入格式没读明白即使算法逻辑完全正确也一分拿不到。常见的输入格式有第一行是一个整数n第二行是n个整数或者每一行都是不定长的数据又或者一行里既有字符串又有数字。不管哪种格式都要在写代码之前想清楚怎么读。这里分享几个基本功Java里用BufferedReader比Scanner更适合处理大量输入C里用getline可以处理带空格的整行Python里可以用sys.stdin.read().strip().split()整块读入再切分。以Python为例典型写法是这样import sys data sys.stdin.read().strip().split() if not data: exit() n int(data[0]) nums list(map(int, data[1:1n])) # 后续逻辑...很多同学在本地测试时习惯手动输入数据但笔试系统是标准输入重定向如果你没有处理“没有输入”的情况程序直接crash整个测试用例都会判失败。4.2 边界条件本地能过、提交就挂的元凶在线编程判题最让人崩溃的一刻就是本地跑得好好的一提交就有一两个用例不过。绝大多数情况下问题出在边界条件上。比如数组为空、n等于1、字符串里全是空格、输入存在负数、数据量达到上限、有重复元素等。以数组题为例如果你要访问arr[i-1]但i从0开始循环里又没有加判断数组越界就很常见。又比如最长公共前缀那类字符串题如果其中一个字符串为空你的循环条件可能直接不成立导致输出结果不明确。成熟的做题习惯是代码写完后主动构造几组“极端用例”来跑包括输入为空、只有一个元素、最大数值、最小数值、重复元素这几种情况。如果都能跑通提交后挂的概率就低很多。4.3 数据类型与时间复杂度的预判看题目时一定要先注意数据范围。范围不同方案完全不一样。比如n小于100O(n^3)都可以接受n是10^5O(n^2)大概率超时n是10^9可能要用数学公式或更高效的算法。数据类型也一样。C和Java里int范围大概是2.1×10^9如果题目里数值范围到10^9乘法运算就可能溢出直接用long long会安全很多。Python的int没有溢出问题但要注意运算复杂度超大整数运算同样可能拖慢速度。我自己的经验是看到数据范围1e9直接用long long看到1e18连long long都要小心乘法先判断是否会溢出再做运算看到数组长度10^6以上尽量别用冒泡排序这种复杂度高的写法。5. 从高频题型谈解题策略5.1 字符串题先列规则再动手字符串题目最忌讳的就是题目没读完就开始写代码。我的做法是读完题目后先在草稿纸上列出全部规则包括输入格式、处理规则、输出格式。举个例子如果题目要求“将一个字符串按单词反转单词之间用空格分隔且允许多个连续空格”那你的规则列表就要写清楚怎么切分多个空格算不算分隔符反转后是否保留原有多余空格。把这些细节都理清楚之后代码写起来会非常流畅也不容易漏条件。如果涉及字符频率统计可以先用哈希表统计再排序或维护一个k大小的小顶堆。统计类题目十有八九要用哈希核心是记住哈希表能帮你把O(n^2)的比较降成O(n)的查找。5.2 模拟题画状态图比写一长串分支靠谱模拟题的代码容易写得又长又乱尤其是需要处理多个状态的场景。这时在草稿纸上画出状态转移图会比你直接写if-else清晰得多。状态图只要画清楚“每个状态对应什么操作遇到什么输入跳转到哪个状态”代码就是按图施工不容易漏。还有一个隐藏技巧模拟题尽量把“每一步的操作”封装成独立的小函数。比如设置一个process(char c)函数处理一次操作主循环里只需要不断调用它代码的可读性和可调试性都会好很多。即使某个用例没过也能通过日志快速定位是哪一步逻辑出了问题。5.3 DP题先把状态定义写清楚现场做动态规划题时最关键的一步不是写代码而是确定状态定义。dp[i]表示什么如果定义错后面全盘皆输。我的习惯是拿到一道DP题先在草稿纸上写出三行状态定义、转移方程、初始化条件。以斐波那契数列为例状态定义是dp[i]表示第i项的值转移方程是dp[i] dp[i-1] dp[i-2]初始化是dp[0]0、dp[1]1。这三行写清楚之后代码就是填空。笔试中的DP题通常不会绕太远很多都能归到经典模型里。练题的时候可以把模型按类整理背包类、序列类、区间类、路径类。每个模型记住它的状态定义和典型转移思路现场遇到新题时能快速匹配到最近的模型再按题目细节调整。5.4 暴力解法是一道保险如果一道题想了十分钟还是没有优化思路不要直接放弃。先写一个逻辑正确但复杂度可能偏高的暴力解法至少能拿下一部分测试用例。很多平台按用例完成比例给分暴力能过30%到50%的用例也比零分强。而且暴力解法不是白做的。很多最优解是在暴力解法的基础上优化出来的你写着写着暴力的代码可能就隐隐约约发现了重复计算的部分那就是优化的方向。比如把暴力里重复的循环换成前缀和或者把枚举换成二分复杂度就降下来了。先把暴力写上再想优化这样既保底又不耽误思考是笔试里非常实用的策略。6. 复盘与前瞻笔试之后该做什么6.1 考后整理比考试本身更重要笔试结束并不意味着这次学习的终点对它进行复盘才是价值兑现的开始。不管考得好不好我都建议把整张卷子从头到尾重新梳理一遍。每一道编程题无论AC还是没AC都重新写一遍直到彻底搞懂。特别是那些没完全做出来的题一定要把标准解法自己实现一遍看和你的思路差距在哪里。有同学觉得笔试结束成绩都定了复盘还有意义吗意义非常大。校招是一个连续的过程笔试只是其中一环你前面投的每一家公司笔试中暴露的问题都会在下一轮笔试或面试中再次出现。把这一点做好你的后续几场笔试会越打越顺。6.2 按模块刷题更容易形成体系想备战在线编程笔试最有效的方式就是按板块集中刷题比如这个星期主攻字符串下个星期主攻动态规划再下个星期主攻模拟。而不是每天随机做五道题知识点散落一地难以形成体系。刷题过程中建议整理一份属于自己的错题本不是简单抄题而是记录每道题的考点、失败原因、正确思路。在刷题网站上可以直接利用按标签筛选的功能比如按“字符串”“动态规划”“贪心”等标签分类练习。连续刷几天同类题你自然会对这一类题的套路产生肌肉记忆。6.3 限时模拟训练是不可或缺的一环考前一周至少要进行两次完整的限时模拟。模拟的时候要尽量还原真实笔试环境关掉手机关掉所有即时通讯找一个不被打扰的地方定时90分钟完完整整做一套题。中途不暂停、不查资料、不随便离开。为什么要限时模拟因为在线编程笔试最核心的能力不是单题正确率而是“在压力下稳定输出”。很多人练习时能轻松AC但一到限时环境下就会因为紧张而频繁犯错比如搞错输入格式、忘写边界条件、思路中断后无法衔接。模拟训练能让你适应这种压力形成属于自己的做题节奏。6.4 笔试之后还有更长的路通过笔试只意味着你拿到了下一关的入场券后面还有技术面试、HR面等多个环节。很多同学笔试通过后就松了一大口气结果面试准备不足翻车在最后阶段。正确的心态是把笔试当成一次免费的查漏补缺机会考完立刻把薄弱环节补上同时开始准备项目介绍、基础知识、手撕代码等面试环节。我在准备校招时习惯用一个Excel表记录每家公司的进展投递时间、笔试时间、笔试复盘、面试时间、面试复盘。这个表格帮我保持了很清晰的节奏也让每一场笔试的经验可以延续到后面的流程中。如果你还没有建立自己的进度管理方式不妨从记一次笔试复盘开始。
返回列表