尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

vivo 2018秋招软件开发岗笔试题复盘:高频考点与编程题解析

vivo 2018秋招软件开发岗笔试题复盘:高频考点与编程题解析 如果你准备过安卓、嵌入式或者移动端相关的软件开发岗vivo 这套 2018 秋招笔试题值得好好拿出来复盘。一方面它的题型分布很典型客观题考基础、编程题考代码实现整张卷子的节奏和难度都很有代表性另一方面这套题涉及的考点——进程线程、内存管理、TCP、排序、链表、字符串处理——到现在依然是绝大多数软件开发岗笔试的高频区。很多人觉得 2018 年的题太旧没参考价值但我个人的看法恰恰相反校招笔试考的是基础功底基础这东西几年内不会有太大变化把一套经典卷子嚼透了比盲目刷几十套新题都管用。这篇文章我会从整套试卷的题型架构出发逐个模块拆考点再把两道典型编程题的完整实现和踩坑点写出来最后分享一些我在实际刷题和复盘过程中的时间分配方案。内容主要面向准备软件开发校招、尤其是移动终端或嵌入式方向的同学如果你正在准备社招基础面试这套题的底层思路同样有参考意义。1. 先从题型架构说起vivo 2018 秋招笔试到底考了什么1.1 试卷结构与时间压力的真实感受vivo 2018 秋招软件开发岗的笔试整体上是“客观题 编程题”的组合。客观题覆盖操作系统、计算机网络、数据结构与算法、C/C/Java 语言基础编程题一般是两道要求在线编译提交。考试时间我记得是 90 分钟上下这个时间设计得很“险”客观题如果不控制节奏后面编程题基本只能仓促收尾。我当时做这套题的真实感受是客观题里有一批题非常直接比如进程和线程的区别、死锁产生的条件、TCP 建立连接的过程这些属于“背过就有分”的题但也有相当一部分题是拐了弯的比如给一段 C 语言代码问你输出什么、给一个排序算法的中间序列问你用的是哪种排序。这类题不光是记结论还得真正理解机制否则很容易在两个相似选项里犹豫。从岗位方向上看vivo 2018 秋招的软件开发岗包含移动应用开发和底层/嵌入式方向所以试卷里能明显看到对操作系统和内存管理的侧重。这个现象到今天依然存在——做手机终端的公司应用层要懂系统机制底层更要懂系统机制所以操作系统基本是必考大头。1.2 为什么这套题的考点到现在还值得刷有一个很常见的误区刷笔试题只追最新年份觉得旧题过时了。但校招笔试考的是“内功”不是“新框架”——排序、链表、二叉树、进程调度、TCP 状态迁移十年前在考现在依然在考。vivo 2018 这套题的考点选取几乎就是教科书重点的浓缩版把这些题弄透相当于把计算机基础的主干过了一遍。还有一个更现实的原因vivo、以及类似体量的终端厂商笔试风格偏“稳”不会出偏题怪题。它们的目的是在短时间内筛出基础扎实、能写代码的人。所以你用这套题做练手能比较好地模拟真实笔试的难度和节奏比一上来就啃竞赛题要友好得多。1.3 客观题与编程题的分工逻辑客观题的核心作用是“海选”通过大量基础点快速判断候选人有没有计算机学科的基本盘。这部分答得稳说明你上课或自学时认真积累了答得差编程题写得再好也可能进不了面试因为笔试系统是综合排名的。编程题的核心作用是“区分”主要是看两件事一是你能不能把思路转化成无 bug 的代码二是你在边界条件和性能上有没有意识。两道题通常是一道偏数据结构链表、树、栈队列一道偏字符串或模拟。分值占比虽然不是绝对大头但往往是拉开差距的关键——客观题大家差距不大编程题全过和过一道排名可能差出几百名。2. 客观题高频考点逐个拆解操作系统是重头戏2.1 操作系统四大必考方向操作系统在 vivo 这套题里的占比感觉最高最常见的是以下四类进程与线程是绝对的基础题围绕它们会展开考进程和线程的区别、线程共享哪些资源、进程间通信方式。常见考法是一道多选“下列哪些属于进程间通信方式”管道、消息队列、共享内存、信号量都算socket 在某些教材里也算。这个点如果丢分说明基础书还没过完。死锁也是高频点。四个必要条件——互斥、持有并等待、不可剥夺、循环等待——几乎每年换着花样考。有时候给一段并发代码问你会不会死锁本质也是考这四个条件同时是否满足。做这类题有一个经验只要题里没有明确说“资源可以被抢占”默认都满足不可剥夺条件这时候优先检查是否形成循环等待。内存管理部分重点在虚拟内存、页面置换算法和分段分页。虚拟内存解决什么问题、缺页中断是什么、LRU 和 FIFO 的差别都是选择题的常客。这一块如果深入复习还可以连带看看快表和多级页表对理解移动端的内存优化也有帮助。线程同步与通信涉及互斥锁、信号量、条件变量。vivo 的题不会考得太深但会拿 Java 的 synchronized 或 C 的 mutex 做引子问你背后的原理。2.2 计算机网络三次握手和状态码是送分题计算机网络在整套题里占比不如操作系统但属于“性价比极高”的模块。只要把最常见的几个问题记牢基本不会失分TCP 三次握手的过程、为什么是三次不是两次、四次挥手时 TIME_WAIT 的作用、TCP 和 UDP 的区别。此外 HTTP 状态码也常考比如 301 和 302 的区别、404 和 500 的含义。这里我建议大家把 TCP 状态迁移图画一遍。不是为了应付笔试而是面试时也经常要手撕。画一遍之后你会明白为什么主动关闭方要停留在 TIME_WAIT为什么被动关闭方要进入 CLOSE_WAIT。理解了状态迁移选择题不管怎么改场景你都能推断出答案。2.3 数据结构与算法排序、链表、二叉树数据结构部分是客观题的另一个大头。排序算法几乎是必考快速排序、归并排序、堆排序的平均/最坏时间复杂度稳定性如何以及一趟排序之后的序列长什么样。vivo 的题一般不会直接问“快排复杂度是多少”而是给一个序列问你“以下哪个是快速排序第一趟后的结果”这需要你真正理解快排的分区逻辑否则只能瞎猜。链表和二叉树也是高频考点。链表常考的是反转、找环、合并有序链表二叉树常考的是前中后序遍历、层次遍历、根据遍历序列重建二叉树。这些题有时候放在选择题里问时间复杂度和空间复杂度有时候直接变成编程题。我的建议是二叉树遍历的递归和非递归写法都要会因为笔试环境里递归没问题但面试手撕时面试官可能要求你用迭代。2.4 语言基础C/C 与 Java 的细节陷阱vivo 的软件开发岗对语言没有唯一限定C 和 Java 都有涉及。这部分的题非常考验细节常见的有static 关键字的作用、指针和引用的区别、const 修饰的是什么、虚函数和纯虚函数的区别、Java 里 String 和 StringBuilder 的区别、HashMap 的底层结构。这类题有一个特点看起来简单但往往有陷阱。比如“以下哪种情况下会发生栈溢出”选项里包括递归过深、申请大数组、内存泄漏、死循环。答案是递归过深和申请大数组但很多人会把内存泄漏也选上——内存泄漏在 C/C 里会导致可用内存变少但不是栈溢出。这种细节需要平时积累临时抱佛脚容易踩坑。2.5 结合热搜词的延伸思考从笔试题看嵌入式与移动开发看到搜热词里有 s32k314 软件开发教程、嵌入式软件开发、ASPICE 软件开发流程我猜不少关注这套题的人方向其实偏向嵌入式或汽车电子。这里多说一句不管是手机终端还是嵌入式终端笔试的地基是通用的——操作系统、计算机网络、数据结构、C 语言。vivo 这套题的价值正在于此它不涉及具体芯片或工具链而是把通用基础题做了一次集中展示。如果你准备的是嵌入式岗刷完这套题之后建议再补充一些硬件相关的基础比如寄存器操作、中断处理、内存映射、I2C/SPI/UART 通信协议这些在 vivo 笔试里不会大面积出现但在嵌入式软件开发的面试环节经常被追问。ASPICE 这类流程规范笔试一般不考更多是入职后接触的工程方法论。所以方向不同的同学可以把这套题当作“第一轮筛选题”来准备后续再按岗位做增量补充。3. 编程题实操复盘两道题四个边界条件3.1 链表反转迭代法、递归法、头插法一次讲透链表反转是校招笔试里出现频率最高的一道题没有之一。vivo 2018 那套题里也有它的身影题目描述大致是给定一个单链表将其反转后返回新链表的头节点。先给一个最常见的迭代解法struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* reverseList(ListNode* head) { ListNode *prev nullptr; ListNode *curr head; while (curr) { ListNode *nextTemp curr-next; curr-next prev; prev curr; curr nextTemp; } return prev; }这段代码的核心逻辑是三个指针的协同prev 指向已经反转好的部分curr 指向当前要处理的新节点nextTemp 负责记录下一个节点防止断链。循环终止条件是 curr 为空此时 prev 正好是新链表的头。写这道题最容易犯的错误是忘记保存 nextTemp。如果你先执行“curr-next prev”原来的下一个节点就丢了链表后半部分直接断掉。我第一次手写链表反转时就在这里栽过所以建议把“先保存后继再改指向”这个顺序刻在脑子里。递归版本也值得会写虽然笔试时可能用不上但面试时展现出来是加分项ListNode* reverseList(ListNode* head) { if (!head || !head-next) { return head; } ListNode *newHead reverseList(head-next); head-next-next head; head-next nullptr; return newHead; }理解递归的关键在于你只需要关注“当前层”发生了什么。当前节点是 head它的下一个节点是 head-next递归调用把 head-next 后面的部分全部反转了所以此时 head-next 已经是反转后链表的尾节点只要让 head-next-next 指向 head再把 head-next 置空就完成了当前层的反转。边界条件也要注意空链表和只有一个节点的链表不用反转直接返回 head。很多同学代码写对了但没处理空链表结果在测试用例上报错这种失分太可惜。3.2 最长公共子串从暴力到动态规划vivo 2018 笔试的编程题里字符串处理类经常会出现“最长公共子串”或“最长公共子序列”的变体。这类题考的是动态规划的基础能力也是很多人的薄弱项。先看问题给定两个字符串求它们的最长公共子串长度。注意子串要求连续子序列不要求连续。最简单的思路是暴力枚举所有子串再逐个比较时间复杂度 O(n^3)字符串长度一上来就炸了。用动态规划优化思路是这样的定义 dp[i][j] 表示以字符串 A 的第 i 个字符结尾、以字符串 B 的第 j 个字符结尾的公共子串长度。如果 A[i] B[j]那么 dp[i][j] dp[i-1][j-1] 1否则 dp[i][j] 0。遍历过程中记录最大值即可。int longestCommonSubstring(const string A, const string B) { int m A.size(), n B.size(); vectorvectorint dp(m 1, vectorint(n 1, 0)); int maxLen 0; for (int i 1; i m; i) { for (int j 1; j n; j) { if (A[i - 1] B[j - 1]) { dp[i][j] dp[i - 1][j - 1] 1; maxLen max(maxLen, dp[i][j]); } } } return maxLen; }这里有一个很关键的细节dp 数组的大小是 (m1) x (n1)下标从 1 开始这样可以省去 i-1 和 j-1 越界的判断。这也是动态规划题里一个通用的技巧先多开一圈空间处理边界会省很多事。空间还能继续优化。因为 dp[i][j] 只依赖 dp[i-1][j-1]也就是左上角的值所以可以用一维数组加一个临时变量来维护。笔试时大多数情况不要求极限优化但如果你把空间优化写出来是个加分项。我建议先把二维版本写熟练再考虑一维别一上来就挑战高难度写法。3.3 编程题的输入输出处理校招笔试最容易被忽视的坎编程题代码逻辑对了但提交后 0 分这种情况我见过太多次十有八九是卡在输入输出上。vivo 的笔试系统常见输入形式是第一行一个整数 n第二行有 n 个整数。很多同学直接用 cin 连续读不处理换行符结果数据错位。处理这类情况有一个习惯先用 getline 读一整行再用 istringstream 拆分或者直接用 cin 连续读入但脑子里要对“读几个数”有数。多组输入的情况要留意循环条件比如 while (cin n)。还有一种坑是字符串里包含空格如果题目说“一行字符串”你得确认它是否包含空格。包含空格时用 getline不包含时用 cin判断错了答案就会不对。另外笔试环境一般支持 C11但个别系统可能用老标准。建议写代码时避免太依赖新特性比如 auto、unordered_map 在绝大多数环境里都能用但 lambda 表达式和结构化绑定不一定全支持。稳妥起见用最朴素的写法功能一样坑还少。4. 答题策略与时间分配90 分钟怎么打最划算4.1 前 30 分钟先解决客观题但不要恋战我的建议是拿到卷子先快速浏览一遍客观题给每道题设一个心理上限。简单题一眼看出答案的直接选不回头中等题 1 分钟内没有思路先标记跳过难题不要纠结随便填一个有时间再回来看。客观题部分总时间控制在 30 到 35 分钟。不要想着每道题都十拿九稳笔试是排名制不是满分制你要做的是在有限时间里拿到最多分数。一道题卡 5 分钟就算最后做对了也可能导致后面的编程题没了时间得不偿失。如果遇到不会的题蒙也有技巧多选题拿不准的选项不选宁可少得分不要错扣分单选题排除两个明显错误的选项后剩下两个里猜一个正确率能提高不少。4.2 编程题先写暴力解再优化很多同学一上来就憋最优解结果憋了 30 分钟没憋出来最后一题都没写。我的策略是先把暴力解写出来保证通过部分用例拿到保底分然后再思考怎么优化。vivo 笔试的测试用例一般分多组暴力解通过前面的小数据用例通常没问题能拿一部分分优化之后再把大数据用例过了基本就稳了。比如最长公共子串那道题你先把 O(n^3) 的暴力写出来能拿 40% 左右的分数再改成动态规划就能拿满。千万别小看这 40%校招笔试的排名差距往往就体现在“保底分”上。写完代码之后一定要自己构造几个测试用例跑一遍。重点测空输入、单元素输入、最大长度输入、重复元素输入。例如链表反转就测空链表和只有一个节点的链表最长公共子串就测两个空串和一个字符相等的串。这些用例能帮你暴露边界条件的错误。4.3 编程题的“稳”比“快”重要笔试系统最常见的报错不是答案错误而是编译错误和运行时错误。编译错误通常是语法问题比如少写一个分号、变量名拼错。运行时错误大多是数组越界、访问空指针、递归栈溢出。为了避免运行时错误我写代码时会特别关注每个数组下标申请了大小为 n 的数组下标一定要控制在 0 到 n-1访问链表节点前先判断是否为 nullptr递归深度可能很大的题目优先考虑迭代写法。另外如果你的代码里用了临时变量来交换值注意类型是否匹配。C 里某些隐式类型转换可能会让结果跟你预期的不一样。比如两个 int 相除结果还是 int如果你期望浮点数就得写成 (double)a / b。5. 常见问题与避坑实录我在刷这套题时踩过的坑5.1 选择题的“二选一”纠结做选择题时最难受的不是完全不会而是在两个选项之间摇摆不定。我踩过的一个典型坑是题目问“下列关于进程和线程的说法错误的是”四个选项里有三个都是对的只有一个错误。这时候你把每个选项都往回套一遍比凭感觉选要稳。还有一个经验遇到从来没见过的术语不要慌。它往往是某个熟悉概念的包装说法。比如考页面置换算法时选项里出现“Clock 算法”其实就是 LRU 的一种近似实现。你知道 LRU 就能推断出 Clock 的大致行为。准备选择题时建议建立一个“错题原因表”每一道错题标注是概念不清、审题不细、还是计算错误。这样复盘时会很清楚自己的薄弱点在哪里。我当时就是拿一张表格把每道错题对应到考纲里的章节最后发现计算机网络里的 HTTP 状态码错得最多回头专项补了一遍。5.2 编程题编译环境差异问题笔试系统的编译器和本地环境经常有差异。最常见的问题包括本地用的是较新版本的 GCC支持某些 C17 特性但笔试系统只支持 C11本地头文件缺失但笔试系统能过本地编码是 UTF-8系统里中文字符串匹配出错。我的建议是日常刷题就用主流的在线评测系统它和你真实笔试环境最接近。写代码时尽量用 C11 之前的语法避免使用 structured binding、if constexpr 这些新特性。如果代码里必须用某些库函数优先选择标准模板库里的自定义函数和类型放在 main 函数前面。环境差异还有一个隐蔽点某些编译器对未初始化的局部变量会给出随机值而另一些编译器会给零值。如果代码里用到了未初始化的 int本地跑可能没事提交后结果却是错的。所以定义变量时一定要赋初值这是一个非常好的习惯。5.3 心态崩塌的瞬间做不出来要不要提交我见过很多同学编程题卡了 20 分钟心态崩了直接放弃交卷。这里我想说一句笔试不要求全对你只需要比同一批人得分高。一道编程题做不出来不代表整场考试结束。正确的做法是放一放回头检查客观题把那些标记过的题再想想。很多时候你在做下一题时卡住的那道题的思路会突然冒出来。即使最后还是没做出来也要保证交上去的代码能编译、能通过部分用例。留一个稳的 60 分比交一个跑不起来的“满分思路”要好得多。另外笔试前一定要睡好。vivo 的笔试时间一般安排在晚上白天上课或实习已经很累了晚上脑子转得慢很正常。我第二场笔试时因为前一天熬夜编程题的思路明显跟不上之后我就学乖了笔试前一周调整作息考试当天不碰新题只翻错题本。6. 套题复盘方法把一套题的价值榨干6.1 建立考点对照表按章节归档错题刷完一套题不要对完答案就扔。我的复盘方法是把整套题按考点分类统计每一类考点出现的题量和错题量。比如操作系统考了 12 题错了 3 题计算机网络考了 7 题错了 4 题。这样一轮下来你就知道自己的短板在哪里。每个错题要记录两行字一行是题目考点一行是错误原因。积累多了以后考前只看这个表就够了不用再翻厚厚的基础书。这个方法不仅能用于 vivo 这套题你以后刷其他公司的题也可以套用。我当时就是靠这个表把操作系统里的虚拟内存部分彻底补了上去。6.2 编程题只刷一遍等于没刷编程题至少要刷三遍。第一遍自己独立思考能写多少写多少第二遍看别人优秀解法理解后合上笔记重新写第三遍一周后限时重写看自己能不能独立做出来。链表反转和最长公共子串这类经典题值得把常规解法和优化解法都写一遍。将来面试环节手撕代码很可能就是这些题换个马甲。我后来参加 vivo 面试时技术面就让现场写一个链表反转因为我筆試时已经练得滚瓜烂熟当场很顺畅地写出了迭代版本还讲了一下递归版本的区别。6.3 从一套题延伸到一类题由链表反转变为能够顺手解决回文链表、两数相加、合并有序链表由最长公共子串延伸到编辑距离、最长递增子序列、最长回文子串。这样做的价值在于你练的不再是孤立的一道题而是一整类问题的解题模板。我在复习动态规划时就把常见题型归成了三类线性 DP、区间 DP、背包 DP。vivo 考的公共子串属于线性 DP编辑距离也是线性 DP最长回文子串属于区间 DP。分类之后遇到新题就能快速定位到对应模板思路会清晰很多。这套方法学到的不是一个答案而是一种思考框架。根据我个人刷题和带人的经验笔试能力的提升不是靠题量堆出来的而是靠“做一道、透一道、延伸一类”堆出来的。vivo 2018 秋招这套题虽然时间有些年头但考点完全不过时非常适合作为基础检测和复盘素材。你要是能把里面的每一道选择题都讲清楚考点编程题能实现两种解法以上再去做其他公司的同类型岗位笔试题会发现大部分题都是熟面孔。
返回列表