ARTICLE DETAIL

资讯详情

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

唯品会秋招开发A类卷复盘:校招笔试背后的能力模型与复习策略

唯品会秋招开发A类卷复盘:校招笔试背后的能力模型与复习策略 准备过校招的人大概率都刷到过“唯品会2019秋招开发A类试卷”这个关键词。很多人搜真题只是为了求一份标准答案但我的看法不太一样校招笔试题从不出重复原题真正值钱的是它背后那套能力模型。你把这套模型看懂了不管题目怎么换心里都有底。这份卷子我复盘过好几次它是典型的“互联网后端开发通用卷”数据结构与算法占大头网络、操作系统、数据库穿插其中再加几道逻辑题。整体难度不算变态但覆盖面很广恰好能照出一个人的基础扎不扎实。对准备校招的同学来说这份卷子最大的价值不是押题而是帮你快速定位自己的知识盲区。我在这篇文章里会从卷子结构、核心考点、解题思路、复习策略几个维度拆一遍。如果你是正在找后端开发、Java开发岗位的应届生或者刚起步准备秋招这篇值得收藏了慢慢看。1. 拆解一下开发A类卷它到底在考什么1.1 “A类卷”的含义与岗位定位很多同学第一次看到“开发A类试卷”会有点懵A类到底是什么意思按我参加过校招的经验互联网公司笔试通常分两类一类按岗位分前后端、算法、测试各有各的卷子另一类按方向分A/B/C卷本质是区分不同的岗位方向或者难度梯度。“A类”通常对应的是综合开发方向以Java后端、服务端开发为主覆盖面比较广。唯品会的业务核心是特卖电商对后端开发的要求集中在几个关键词上高并发、分布式、订单与库存一致性、大促稳定性。A类卷看着是在考基础实际上每一道题都在暗示你能不能扛住这类业务场景。比如算法题经常出TopK、海量数据去重不是单纯考堆排序而是电商日志里真真切切会遇到的问题。所以我的建议是不要用“应付一场笔试”的心态去看这份卷子把它当成一次“后端工程师能力体检”你刷完会很清楚自己离岗位要求差在哪里。1.2 典型考点模块与分值侧重我根据实际笔试的回忆版把这类卷子的常见模块整理成了表格方便你对照检查自己的复习情况考点模块考试形式大致占比优先级数据结构与算法单选、编程题40% ~ 50%必须重点准备计算机网络单选、多选、简答15% ~ 20%必须重点准备操作系统单选、多选、填空10% ~ 15%建议重点准备数据库与SQL单选、简答10% ~ 15%建议重点准备智力题/逻辑题单选、简答5% ~ 10%刷题顺带准备编程语言基础选择、代码填空5% ~ 10%根据岗位而定从这个分布能看出数据结构与算法如果不行基本告别笔试了。剩下几块属于“固定拿分项”不需要你有多深的底层理解只要按部就班背熟原理、刷完必考题都能拿到不错的分数。1.3 从命题逻辑反推企业用人标准我说一个观察大部分校招笔试命题人并不是想让所有人都做满分而是想通过题目把候选人分成几个档次。第一档是算法扎实、基础理论流畅的人第二档是基础尚可、算法有明显短板的第三档是啥都只会一点、但都说不深的人。唯品会这类电商公司业务有比较明显的高并发峰值场景比如“6.16”大促、“12.8”特卖节技术团队很看重候选人对性能、缓存、并发控制这些敏感度。因此卷子里会高频出现以下信号TCP三次握手、四次挥手——考察你有没有系统学过网络而不是背两天八股就完事。数据库索引原理——考察你对慢查询、SQL优化的理解。海量数据TopK、哈希去重——考察你面对大数据量时有没有复杂度意识。换句话说企业不是要一个“做题家”而是想找“能写生产代码的人”。你复习的时候就要带着这个意识每做一道题除了会做还要想一想它对应生产环境里的什么场景。2. 算法题的三种常见形态字符串、链表、动态规划2.1 字符串处理哈希统计与排序输出的组合拳字符串题在笔试里基本是必出题常见考法包括字符统计、最长子串、回文判断、字符串匹配。2019年这类卷子里有一道很典型的给定一个字符串统计每个字符出现的次数并按出现次数从高到低输出如果次数相同则按字符的字典序输出。这道题考察的绝对不是单纯排序而是两个点一是哈希表的使用习惯二是排序稳定性处理。你如果直接用HashMap存完value再sort需要自己写比较器同时保证“次数相同按字典序”这一优先级。很多人在最后一步Comparator写错导致输出顺序不对。我当时用的方案是先遍历一次字符串用int数组或者HashMap统计频次再把所有字符按频次排序排序时比较器里先比频次、再比字符大小。复杂度是O(n k log k)其中k是不同字符数。笔试环境里这个复杂度完全够用不要一上来就想用什么高级结构。这类题拿分的关键其实是“边界意识”空字符串、只有一种字符、大小写混排这些case都要想到。最好在提交前自己在草稿纸上推一遍小样例我见过太多人代码逻辑没问题结果没处理空串直接扣一半分。2.2 链表操作反转与环检测背后的指针思维链表是校招笔试的“常青树”因为它的操作天然考察你对引用、指针、内存布局的理解。开发A类卷里常见的链表题有两类反转链表、检测链表是否有环。看起来简单但实际撸代码时很多人会卡在指针的“先保存、再修改”顺序上。反转链表标准写法是迭代核心逻辑只有三行先把当前节点的next保存下来再把当前节点的next指向前一个节点最后把前驱和当前指针都往后移。但如果你没有理解“保存next是必须的”很容易写出空指针异常。笔试的时候没有IDE调试你必须靠脑内模拟几个节点来验证。环检测一般要求用快慢指针快指针每次走两步慢指针每次走一步如果两个指针相遇说明有环。为什么快慢指针一定能相遇因为当慢指针进入环后快指针已经在环里两者相对速度为1每轮都会靠近一步所以最终必然相遇。这个推导过程面试时常常要你讲笔试虽然只考代码但建议你也把原理吃透。链表这类题我个人的经验是动手写之前先在草稿纸上画一下节点变化图尤其是修改next指针的顺序。这一步看起来浪费时间实际能帮你省下好几轮debug的时间绝对是划算的。2.3 动态规划从暴力递归到状态转移的思维跃迁动态规划几乎是大厂笔试的“压轴常客”2019年的开发A类卷里也出现了类似“最长公共子序列”和“编辑距离”这类经典题。它的核心难点不是代码而是状态定义与转移方程的推导。以最长公共子序列为例如果你用暴力递归就是把每个字符的选和不选都枚举出来时间复杂度是O(2^n)肯定超时。优化的方向是发现“子问题之间大量重复”于是用二维数组dp[i][j]表示“字符串A前i个字符”和“字符串B前j个字符”的最长公共子序列长度。状态转移时有两种情况两个字符相等dp[i][j] dp[i-1][j-1] 1不相等则取dp[i-1][j]和dp[i][j-1]两者中的较大值。这样时间复杂度降到O(n*m)空间也可以进一步压缩到一维滚动数组。很多新手踩的坑是二维dp初始化不准。比如dp[0][j]和dp[i][0]应该全部是0这个边界条件不对后面全盘皆输。笔试时我会建议先把dp表格手动画3行3列看看规律再写代码这样准确率会高很多。动态规划没有捷径就是多刷几类最长子序列、背包问题、爬楼梯、编辑距离、股票买卖刷熟了就会发现思路都差不多定义状态、找出转移、确定边界。理解到这一步笔试里的DP题基本都能拿个差不多的分数。2.4 海量数据处理TopK与去重的实际思路海量数据题是这份卷子里最贴近电商场景的一类。比如“从10亿个数中找出最大的100个”或者“统计某个大日志文件中出现次数最多的IP”。这类题的核心不是用什么高深的算法而是复杂度思维的体现。最大/最小的TopK问题在内存足够时可以直接排序但10亿个数全排序既慢又浪费。标准解法是用大小为K的最小堆遍历一遍数据堆没满就放入堆满了就比较新元素和堆顶如果新元素更大就替换堆顶并调整堆。这样时间复杂度是O(n log K)内存只需要O(K)。我习惯直接说“用堆代替全排序”面试官一听就觉得你懂。去重问题则要看场景如果数据范围已知且有限可以用位图Bitmap如果数据范围很大就要用哈希分片或者布隆过滤器。笔试更倾向于考察思路一般不会让你真去实现一个大数据的MapReduce但你要能说出“分而治之”的思路把大文件拆成小文件每个小文件单独统计最后再合并结果。这类题最忌讳的就是一上来就写代码应该先跟面试官或阅卷老师展示你的思考过程。笔试答题空间有限但你能在代码前的注释里写上“用最小堆复杂度O(n log K)”这种话有时候能额外加分。3. 网络、操作系统、数据库基础题不能丢分3.1 计算机网络三次握手不只是背口诀网络题在开发岗笔试里出现频率极高尤其爱考TCP的三次握手和四次挥手。很多同学准备这部分就是背“SYN, SYNACK, ACK”三个词但考卷稍微变个问法就懵了。比如问你“为什么是三次握手而不是两次”或者“三次握手最后一次丢了会发生什么”。这些问题的答案核心在于“确认双方的收发能力”。第一次握手客户端发送SYN服务端知道客户端的发送能力没问题第二次握手服务端回复SYNACK客户端知道服务端的收发能力没问题第三次握手客户端回复ACK服务端确认客户端的接收能力没问题。所以三次是建立可靠连接的最小次数两次无法让服务端确认客户端的接收能力。如果换成场景题比如“TCP粘包是什么原因怎么解决”这也是校招网络题的常见延展。粘包的现象是接收方一次读到了多个消息本质是TCP是字节流协议不维护消息边界。解决方式通常是在应用层设计消息边界比如固定长度、分隔符、或者包头带长度字段。你如果能答到这个层面说明你是真理解了TCP的流式传输模型而不是背了OSI七层模型。3.2 操作系统进程线程与死锁靠例子理解操作系统在笔试里通常占分不高但几乎必考而且考来考去就那么几个点进程与线程的区别、死锁的四个必要条件、虚拟内存与页面置换算法。我复习的时候发现死记定义不如记例子比如进程和线程用“公司”和“员工”来类比就很形象进程是公司有独立的办公场地地址空间、独立的财务资源线程是员工同一个公司的员工共享办公场地和财务但每个员工有自己的办公桌栈空间切换公司进程切换成本高切换员工线程切换成本低。死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待——也要配合例子理解。最经典的例子就是“两个人过独木桥各拿一头”互斥是桥只能一个人走持有并等待是每个人都占着一头还等对方让路不可剥夺是对方不能让其中一个人强制走循环等待就是两人僵持。理解了例子选择题里“以下哪种情况可能死锁”之类的题就不难判断。页面置换算法里LRU最近最久未使用是考查重点。由于电商系统很多缓存场景都用LRU唯品会这类公司出这个题的概率不低。你要会画LRU的淘汰过程也要能写出基于哈希表双向链表的O(1)实现思路。如果笔试让你手写LRU一定要先定义双向链表节点再处理头尾节点的更新注意空指针和边界条件。3.3 数据库索引、事务与SQL是送分题数据库这部分其实是最容易拿分的地方因为它有明确答案。核心考点是三个索引结构、事务ACID特性与隔离级别、SQL写法。索引结构十有八九会问到“为什么InnoDB用B树而不是二叉搜索树或者哈希”。答案要点在“磁盘IO次数”上B树的高度低一般三层就能存几千万条数据查询只需要少量磁盘IO同时叶子节点之间用指针相连适合范围查询。哈希索引适合等值查询但不适合范围查询二叉搜索树在数据量大的时候高度太高、IO次数太多。你把这些点答出来基本把这个考点拿稳了。事务隔离级别这块容易出选择题。四个级别——读未提交、读已提交、可重复读、串行化——要能说清楚每个级别解决了什么问题、残留什么问题。答案关键在三个现象上脏读、不可重复读、幻读。读已提交解决脏读可重复读解决不可重复读串行化解决幻读。MySQL默认的可重复读级别下通过MVCC间隙锁也能解决大部分幻读问题这个进阶点是加分项。SQL题通常让你写“两表联查查出某类用户”这样的查询或者“统计每个分类下的商品数量”。写SQL的核心习惯是先写SELECT和FROM明确表结构再写WHERE、GROUP BY、ORDER BY。排序时注意GROUP BY后面如果用HAVING过滤别把聚合条件写到WHERE里。这个“先搭骨架再填细节”的写法能帮你减少很多低级错误。4. 智力题和业务逻辑题拉开差距的地方4.1 经典概率与逻辑题三门问题与期望计算智力题虽然占比不高但往往是“高分选手”和“普通选手”的分水岭。2019年这个卷子里出现概率与逻辑题的频率不低最常见的是抽奖概率、公平硬币、生日问题这类计算题。我印象很深的一道经典题是“三门问题”三扇门里有一扇门后有奖品你先选一扇主持人打开另一扇没有奖品的门问你是否换选。很多人直觉认为换不换概率一样都是1/2但正确答案是换因为一开始选中的概率是1/3另外两扇门的概率之和是2/3主持人排除了一扇空门后剩下那扇门的概率就是2/3。笔试里如果遇到这种题你不仅要选对还要能写出简要推理过程因为简答题会看你的逻辑链条。期望计算的经典题也很高频比如“抛一枚硬币出现正面得1分出现反面就停止求期望得分”这类题的核心是把期望写成递推式而不是死算。设E为期望如果第一抛是正面则得到1分后可继续所以E 0.5*(1 E) 0.5*0解得E1。你把这个推导写出来阅卷人一眼就知道你不是蒙的。逻辑推理题则更偏“脑筋急转弯”比如“有两个水杯一个5升一个3升如何量出4升水”。这类题没太多方法论关键是临场不要慌。我的建议是冷静地画出状态转移路径类似“BFS搜索水位状态”的思路5升杯和3升杯的水量状态是有限的手动模拟几步就能找到答案。4.2 电商业务场景题满减优惠与库存并发有些业务味道浓的卷子会把智力题包装成电商场景。比如“给定若干商品价格和一张满300减50的券如何组合购买最划算”或者“在秒杀场景下如何避免超卖”。满减组合题本质是一个背包问题或搜索问题。你可以把价格列表和目标门槛放一起用动态规划或回溯法找到满足门槛的最小花费组合。笔试时间有限遇到这类题你首先要判断“模型是什么”然后给出复杂度可接受的解法。哪怕代码写不完全也要写出思路和状态定义让阅卷人看到你的分析能力。库存超卖问题则是高并发领域的高频场景题。核心矛盾是多个请求同时读到库存为1然后各自扣减最后库存变成负数。解决办法通常有几种数据库乐观锁update ... set stock stock - 1 where stock 0、Redis分布式锁、或者用消息队列串行化扣减。笔试时问到这类题你就围绕“保证原子性”来回答提一个方案然后解释它的优缺点就足够了不用追求完美方案。4.3 组织书面答案的技巧校招笔试的简答题很多时候不是“你会不会”的问题而是“你能不能把你的思路写清楚”的问题。我在阅卷角度见过很多同学明明思路对了但文字表达混乱阅卷人根本看不过来。所以我特别建议你在作答时遵循一个固定结构先说结论再给理由最后补充边界。比如“为什么用B树做索引”你的回答可以分三层。第一层直接说“因为B树能减少磁盘IO、支持范围查询”第二层解释树的高度和磁盘IO的关系第三层提一下哈希索引为什么不合适。这样回答即使有些细节不完整阅卷人也能一下抓住你的得分点。反过来如果大段文字全堆在一起阅卷人很可能找不到重点你就白答题了。书面答案还要注意一点公式和复杂度一定要单独写出来。比如动态规划题最后写上“时间复杂度O(n*m)空间复杂度O(m)”这几个词本身就值分数。因为阅卷人看代码不一定能一眼看出复杂度但你写出来他就会留意到。5. 笔试不是光会做题就行环境与时间管理5.1 在线笔试平台的操作细节像唯品会2019秋招这类笔试基本都在牛客网、赛码网这类在线评测系统上完成。很多同学平时刷LeetCode习惯了第一次上校招笔试系统发现输入输出要自己处理直接把String[] args的主函数写成LeetCode的Solution类结果编译不过。这点必须提前适应。牛客这种ACM风格的题需要你处理标准输入输出。比如“第一行输入一个整数n第二行输入n个数”你要用BufferedReader读取然后自己解析。我推荐你提前用牛客网的“在线编程”模块练上两周专门训练Scanner和BufferedReader的输入解析包括处理多行输入、用空格或逗号分隔、读完整行再split这些操作。这个习惯确实有点枯燥但能救你一命。另一个容易被忽视的问题是“本地IDE调试通过提交却报错”。在线评测系统一般不会告诉你具体的测试数据只会告诉你“通过率0%或50%”。这时候你要警惕是不是自己默认了一些错误前提比如数组长度不对、没有考虑大数溢出、Java里用了int存一个很大的结果。建议提交前用几个自己构造的边界案例跑一遍空输入、单元素输入、最大数值输入、重复元素输入。5.2 笔试时间分配先保基础再冲难题校招笔试的时长一般在90分钟到120分钟题量却不小。以开发A类卷的典型结构来说选择题和填空题占了很大一部分代码题反而可能只有两三道。很多人容易犯一个错误在选择题上反复纠结最后留给编程题的时间不够。我的时间分配策略比较简单粗暴选择题和填空题每道不超过1分半钟会就选不会就先按第一感觉标记最后有剩余时间再回来推敲。编程题前先花2分钟通读三题从最简单的入手保证自己至少完整提交一道题再回头啃难题。因为在线评测看的是通过用例数你AC一道简单题的得分往往比三道题都只过一半有效得多。这里还有一个现场技巧如果编程题完全没思路不要空着把你对这道题的分析写进注释里再把暴力解法写出来。哪怕只有O(n^2)的复杂度只要输入规模不大有些测试点还是能过的。这一小步能让你从0分变成50分在笔试题量大、时间紧的情况下这是最务实的策略。5.3 避坑清单我踩过和见过的坑常见坑具体表现对策输入输出不熟子函数写对了主函数不会读多行数据提前用牛客网ACM模式练习忽略边界条件数组越界、空字符串、单节点链表提交前跑3个自定义边界用例选择题浪费过多时间一道简单定义题纠结5分钟先标记最后统一做代码里夹带调试输出提交时忘了删System.out.println提交前全文搜索输出语句不写公式和注释阅卷人看不到你的思路关键行写注释复杂度单独标注浏览器兼容问题代码编辑器里中文输入法把代码搞乱用英文输入法写代码或者本地写好再粘贴这些坑看着都很小但每年都有大量候选人栽在上面。笔试不是只考你会不会还考你在压力下能不能按照工程规范产出一份可运行、可维护的代码。从这个角度想你平时写代码时养成多测边界、写注释的习惯对笔试真的有直接帮助。6. 最后聊聊笔试之外的准备回到开头的话题“唯品会2019秋招开发A类试卷”这份卷子你如果只找原题和答案很快就过时了但如果你用它来做一次能力自测会发现它的价值远超一份试卷。我认识的一个学弟当年靠复盘这份卷子把自己知识体系里的漏洞全补了一遍后来同时拿了三四家电商公司的offer。复盘的方向很好定算法不行就先刷LeetCode热题100和牛客网剑指Offer网络基础不行就去把TCP/IP协议那几章认真读两遍别只背八股数据库就多写SQL最好自己装个MySQL敲一遍索引、事务相关的实验。最重要的是每周给自己安排一次“模拟笔试”严格卡时间、用牛客网环境、关掉AI提示像真实笔试一样面对它。根据我自己的经验校招笔试拼的不是天赋而是稳定输出。把基础的题目做对、把常见坑避开、把时间和精力分配合理你就已经超过一大半人了。这套方法不只适用于唯品会也适用于几乎所有互联网公司的秋招笔试。希望你在接下来的校招季里每一步都走得踏踏实实。
返回列表