秋招开发岗B卷笔试攻略:算法、系统设计与备考策略
2026/8/31 22:08:46 网站建设 项目流程

1. 拿到B卷之后:先看懂出题人在问什么

1.1 为什么会有A/B卷之分

秋招笔试设置A/B卷,是很多大厂的常规操作。核心目的就一个:防作弊。同一场次、同一个岗位方向,A卷和B卷的题目顺序不同,部分题目也会替换。比如A卷的第三题可能在B卷里变成了第七题,或者A卷考了KMP,B卷换成Trie树。如果你在论坛上刷到别人的面经,拿到的是A卷,对着题目准备,进了考场发现题序完全对不上,心态就崩了。

唯品会2019秋招开发B类试卷,这个“B类”并不是说题目更难或更简单,而是相对于A类的另一个平行版本。它的覆盖范围、题型分布和A卷一致,但具体题目有差异。所以备考时不要迷信“这套卷子考了什么”,而要关注“这类卷子一定会考什么”。

1.2 开发岗笔试的常规模块分布

从历年各大厂开发岗笔试来看,题型基本可以分成三块:

第一块是客观题,包括单选、多选和填空题,覆盖数据结构、操作系统、计算机网络、数据库基础、编程语言特性。这部分考察的是你大学四年核心专业课有没有沉淀下来,突击效果有限,但高频考点非常固定。

第二块是编程题,通常是2到4道,从简单到困难递进。前一两道基本是线性表、字符串处理、简单动态规划的级别,后一两道会涉及到复杂的树形DP、图论、贪心与二分结合的优化题。笔试系统里一般要求你用C++、Java、Python提交,核心在于算法正确性和复杂度达标。

第三块是简答题或设计题。很多开发岗笔试会在最后加一道系统设计或场景题,比如“设计一个秒杀系统的核心流程”“购物车模块的数据库表怎么设计”“订单状态机怎么建模”。这一块是区分度最高的,因为它不只看你代码写得好不好,还看你有没有全局思维。

1.3 电商背景下的考点倾斜

唯品会是电商公司,它的笔试题目天然带着电商业务色彩。这意味着什么?虽然基础题和其他互联网大厂没差别,但在设计题和场景题里,它会倾向于考察电商领域常见的技术挑战:高并发、库存超卖、优惠券幂等、订单状态流转、物流信息同步。

我见过不少同学复习笔试时只刷LeetCode,结果碰到“如何设计一个防止库存超卖的秒杀接口”这种设计题就懵了。不是说算法不重要,而是说你得在算法之外,留出时间准备场景题。这个意识在笔试阶段就有,后面面试和工作中都会受益。

2. 算法题:拿稳基础分的答题节奏与边界意识

2.1 高频题型与最低准备标准

开发B类试卷的编程题,按出现频率排序,大概是这样:

第一梯队是链表操作、字符串处理、二叉树遍历和递归。这些是数据结构课上讲烂了的东西,但笔试里非常爱考。比如“反转链表”“合并两个有序链表”“判断链表是否有环”“二叉树的前序中序后序非递归遍历”“字符串中最长不重复子串”。这些题不难,但要求你写得又快又对。

第二梯队是动态规划、贪心、二分查找、BFS/DFS。典型题目如“最长上升子序列”“背包问题”“跳跃游戏”“岛屿数量”“二叉树的层序遍历”。这类题要求你具备基本的算法设计能力。

第三梯队是堆、栈、并查集、Trie树、图的最短路和最小生成树。这些属于进阶内容,在B卷里通常出现在最后一题,属于区分题。

最低准备标准是什么呢?我的建议是,LeetCode Hot 100和剑指Offer两本书吃透,高频题做到看到题目就能条件反射地写出框架。如果你时间紧张,优先保证第一梯队全部掌握,第二梯队掌握常见题,第三梯队了解思路即可。

2.2 先暴力后优化的答题策略

笔试环境里,时间是最稀缺的资源。很多同学拿到一道题,上来就想最优解,结果卡了30分钟没想出来,反而后面容易的题没时间做。我的策略是:先花1分钟看题,判断难度,如果5分钟内想不出明确的最优解法,立刻写一个暴力的答案,保证这题有分,然后继续往下做。整卷做完后,如果还有时间,再回头优化。

笔试系统和面试不一样,它只看你最终提交的代码是否能通过测试用例。暴力解法虽然可能超时,但至少部分用例能过,能拿到部分分数。一个空白的编辑器窗口,是0分;一个能过部分用例的暴力解,可能是30分甚至60分。这个账要算清楚。

2.3 边界条件与复杂度的隐性扣分点

我平时代码评审时经常说一句话:功能正确只是及格,边界处理才是区分度。笔试也一样。

举几个常见例子。反转链表时,空链表和单节点链表你有没有单独处理?二分查找时,左右指针的初始值和退出条件,你的写法会不会导致死循环或漏判边界?动态规划的数组下标,有没有留出空余位置来处理“前0个元素”的状态?字符串处理时,你有没有考虑过空串、全空格串、包含特殊字符的串?

这些问题非常小,但往往就是那10%的测试用例不过,导致你从AC变成WA。我建议你平时刷题时,每道题的代码都强迫自己写一遍边界判断。时间长了,这会成为肌肉记忆,考场上根本不需要额外思考。

还有复杂度的问题。B卷的编程题一般会给出数据范围,比如n≤10^5,这意味着你的算法得是O(n log n)或更低。如果你写出了O(n^2)的解法,即使思路对,也必然超时。拿到题目先看数据范围,这是判断预期解法的重要线索,一定不要忽略。

3. 选择题里的隐藏分:操作系统、网络与数据库的易错点

3.1 操作系统:进程线程与内存管理的经典陷阱

操作系统在笔试选择题里占据很大比重,考察点集中在进程与线程、CPU调度、内存管理、死锁、文件系统这几个模块。

进程与线程的易错点是我见过最多的。很多同学背了“进程是资源分配的最小单位,线程是CPU调度的最小单位”这句话,但题目换个问法就懵了。比如“同一进程内的多个线程共享哪些资源,不共享哪些资源?”正确答案是:共享进程的地址空间、文件描述符、信号处理器,但不共享栈、寄存器上下文,各线程有自己的栈和程序计数器。

内存管理这块,常考的是分页和分段区别、虚拟内存与局部性原理、页面置换算法(FIFO、LRU、Clock)。题目通常会给你一个访存序列,让你算缺页次数。这种题没什么技巧,就是老老实实画表模拟。但要注意:很多教材里缺页次数算的是“访问页不在内存中”的次数,不包含刚开始载入时产生的缺页中断次数,不同教材的统计口径不一样,做题前先看清题目问的是“缺页次数”还是“缺页中断次数”。

死锁的四个必要条件,考过无数次了:互斥、持有并等待、不可剥夺、循环等待。还会考银行家算法,给你一个资源分配表,问某个进程提出请求后系统是否处于安全状态。这题计算量不大,但要求你把安全序列找完整,少一步就算错。

3.2 计算机网络:三次握手与状态码的细节

网络部分,TCP三次握手和四次挥手是必考。常考的点包括:为什么是三次握手而不是两次,为什么要等2MSL才关闭连接,SYN Flood攻击的原理和防护。以及握手过程中各个状态的变化,比如客户端发送SYN后进入SYN_SENT,服务端收到后进入SYN_RCVD,客户端收到SYN+ACK后进入ESTABLISHED。这些状态名词看着多,其实画个状态迁移图就清楚了,但笔试不能画图,你得在脑子里过一遍。

HTTP状态码也是高频考点。2xx表示成功,3xx表示重定向,4xx是客户端错误,5xx是服务端错误。具体到每一个:301是永久重定向,302是临时重定向,304是未修改(协商缓存命中),401是未认证,403是禁止访问,404是资源不存在,500是服务器内部错误,502是网关错误,503是服务不可用。别小看这些,很多同学能分清楚4xx和5xx,但问“304的含义”就答不上来了。

还有个高频考点是TCP和UDP的区别,以及基于它们的应用层协议。TCP有HTTP、FTP、SMTP、SSH,UDP有DNS、DHCP、TFTP、RTP。DNS虽然底层用了UDP,但在区域传送时会用TCP,这个细节常考,也常错。

3.3 数据库:索引与事务隔离的考察方式

数据库题目里,索引的底层数据结构、聚簇索引与非聚簇索引的区别、事务的四大特性(ACID)、隔离级别与脏读/不可重复读/幻读的对应关系,是最高频的四类考点。

索引这块,考B+树的很多。它和B树的区别:B+树所有数据都存在叶子节点,非叶子节点只存索引;B+树叶子节点之间有链表指针,方便范围查询;B+树叶子节点更紧凑,系统可以一次载入更多节点。这些特性正好对应了数据库“读多写少、范围查询多”的场景。

事务隔离级别,从低到高是读未提交、读已提交、可重复读、串行化。Read Uncommitted会导致脏读,Read Committed解决了脏读但会出现不可重复读,Repeatable Read解决了不可重复读但可能出现幻读(MySQL的InnoDB在Repeatable Read级别下通过MVCC和间隙锁已经能解决大部分幻读问题,但严格来说,理论上的幻读解决方案是串行化)。这里要注意,MySQL和标准SQL在隔离级别实现上有差异,笔试如果明确问了“MySQL的默认隔离级别是什么”,答案是Repeatable Read,不是Read Committed,千万别答错。

还有一类常考的是SQL优化题,比如给你一条慢查询,问怎么优化。常见的答案方向:加合适的索引、避免在WHERE子句中对字段做函数操作、避免SELECT *、分页查询用延迟关联。不要求你写出执行计划,但要知道排查思路。

4. 系统设计题:没有标准答案时怎么拿分

4.1 电商场景的设计题长什么样

B卷的最后一道题,往往是一道和电商业务相关的设计题。我整理了几个典型问法:

  • 设计一个秒杀系统,需要支撑瞬间高并发流量,怎么保证库存不超卖?
  • 设计一个购物车模块,需要考虑哪些核心数据结构和接口?
  • 订单系统里,用户下单、支付、取消、退款这些操作的状态流转怎么设计?
  • 用户浏览商品时,怎么设计一个推荐接口,延迟要求P99在200ms以内?

这种题没有唯一答案,考察的是你的架构思维和工程经验。很多应届生一看到这种题就慌,觉得没做过真实项目,完全没思路。其实不需要你真的搭建过千万级并发的系统,面试官想看的,是你能否用已知的技术组件逻辑自洽地解决业务问题。

4.2 答题框架:从需求澄清到存储选型

我总结了一个对付这类题的四步框架,屡试不爽。

第一步,澄清需求。哪怕笔试是白纸答题,也要先写:这个系统的核心痛点是什么?用户量级多大?读写比例如何?数据一致性要求多高?比如秒杀系统,核心痛点就是瞬时高并发和库存超卖,那么你后续的所有设计都要围绕这两个痛点展开。

第二步,做容量估算。虽然笔试卷不要求精确计算,但你要给出一个估算逻辑。比如:假设秒杀商品有1万件,参与秒杀的用户是100万,QPS峰值可能在50万左右。根据这个量级,单机肯定扛不住,需要集群和消息队列来削峰填谷。

第三步,画架构图并解释每个组件的职责。前端有CDN和静态化页面,网关层做限流和防刷,服务层通过Redis预扣库存,最终订单数据异步写入MySQL,用MQ确保最终一致性。这个架构的核心逻辑是:读请求尽量在缓存层就处理掉,写请求通过事务和锁机制防止超卖。

第四步,说清楚关键细节。比如防止超卖,是Redis的原子操作(DECR)预扣库存,还是数据库的乐观锁(UPDATE stock SET stock = stock - 1 WHERE id = ? AND stock > 0)?这两种方案各有优劣。比如幂等性,怎么防止用户重复点击下单按钮导致重复扣库存?可以用前端按钮置灰、后端生成唯一订单号、数据库做唯一索引约束,三层保障。

4.3 如何在纸上画出让人满意的架构

笔试卷子上没有画图工具,你只能手写文字描述,但这不代表不能“画图”。我推荐的方式是,用ASCII字符画简单的组件关系图,同时旁边配上文字说明。

比如可以写:

用户请求 -> CDN/网关(限流、防刷) -> 秒杀服务(Redis预扣库存) -> MQ(削峰) -> 订单服务(DB最终写入)

然后每一行下面配一小段说明,写清楚这个组件解决了什么问题,和下一个组件之间的数据流是什么。这样考官扫一眼就知道你的思路是完整的,而不是只写了几个零散术语。

系统设计题拿分的核心,是“逻辑完整”和“关键词准确”。逻辑完整意味着从请求入口到数据落库,整个链路你都考虑到了;关键词准确意味着你的描述里出现了限流、降级、缓存、消息队列、最终一致性、幂等、分布式锁这些术语,并且用法是正确的。这比堆砌一个看似高级但说不清原理的实现要强得多。

5. 编程语言与工程细节题:笔试里最容易被忽略的实操分

5.1 语言特性的考点分布

开发B类试卷的客观题部分,通常会有几道语言相关的题。绝大多数开发岗要求C++或Java,也有部分岗位用Python。

C++的高频考点是:虚函数与多态的底层实现、智能指针(unique_ptr、shared_ptr、weak_ptr)的底层原理与使用场景、STL容器的底层数据结构(vector是动态数组、list是双向链表、map是红黑树、unordered_map是哈希表)、内存管理(new/delete与malloc/free的区别,以及内存泄漏、野指针)。

Java的高频考点是:HashMap的底层结构(数组+链表+红黑树)、ConcurrentHashMap的锁分段与CAS机制、JVM内存区域划分、垃圾回收算法(标记-清除、复制、标记-整理)及分代回收策略、Java的线程池参数含义(corePoolSize、maximumPoolSize、workQueue和拒绝策略)。

Python的高频考点是:GIL锁的影响、可变对象与不可变对象(list可变、tuple不可变、dict的key必须可哈希)、装饰器的本质(闭包)、生成器与迭代器的区别。

这些知识点特点很明确:都是语言底层机制,而不是API用法。笔试很少考你“某个API怎么调”,因为那是查文档的事,笔试考的是你对语言原理理解得透不透。

5.2 代码规范与异常处理的隐性要求

笔试的编程题,虽然系统主要看测试用例通过率,但代码风格不是完全没人管。有两类题会被人工复核:一类是系统判定你代码有嫌疑,转人工审核;另一类是客观题答案存疑,需要人工校正。这种情况下,你的代码可读性就会影响裁判对你的判断。

我见过不少同学,算法思路完全正确,但因为代码里出现了“魔法数字”(比如直接写if (n % 4 == 0),而不注释这个4是什么)导致误判;或者异常处理写得不完整,被人工复核时觉得是投机取巧。所以,笔试代码也建议像平时写业务代码一样,变量命名清晰、关键逻辑加注释、必要的异常分支写上。

另外提示一下,很多笔试系统允许你多次提交,每次提交都会判分。判分逻辑通常是取最高分,也有的是取最后一次。考前先了解清楚规则,是取最高分还是最后一次。如果是取最后一次,你改错了一行代码,反而可能把之前的高分覆盖掉,得不偿失。

5.3 Linux、调试与工程工具的常见考察

开发岗笔试还有一类容易被低估的题,就是Linux和工程工具的基础题。考察范围包括:

  • 常用命令:lscdgrepfindawksedpstopnetstatsstarchmodchown等。重点不是背命令参数,而是知道什么场景用什么命令。比如“查找日志文件中包含ERROR的行并统计行数”,正确思路是grep 'ERROR' app.log | wc -l,你要能写出这句话。
  • 文件权限:-rw-r--r--是什么意思,chmod 755代表什么权限组合。
  • 进程管理:怎么查看某个进程的CPU和内存占用,怎么优雅终止一个进程(SIGTERM vs SIGKILL)。
  • Git基础:git mergegit rebase的区别,如何撤销上一次提交(git resetvsgit revert)。

这些题对在实验室里用过Linux的同学来说很简单,但对一直用Windows做开发的同学而言,可能一道都不会。建议提前花半天时间,把最常用的Linux命令过一遍。不需要深入内核原理,会用、能完成操作即可。

6. 复盘一套试卷:秋招准备路线的自我校准

6.1 做完整套复盘的正确姿势

笔试结束后,不要急着把题丢到脑后,完整的复盘比多刷二十道题更有价值。

我的复盘方法是三遍法。第一遍,对照答案逐题分析,把自己做错的题和蒙对的题都标出来。做错的题要弄清楚错因:是知识点不会,是粗心算错,还是题目理解偏差;蒙对的题也要记录,因为它说明你的知识点不牢固,只是运气好。

第二遍,把错题涉及的知识点汇总成一个清单,比如“数组边界不熟”“HTTP状态码记混”“SQL JOIN类型分不清”。这个清单就是你的薄弱项地图,接下来一周的复习就围绕它展开,而不是漫无目的地刷题。

第三遍,把每道题还原到它的考点源头。比如“反转链表”这道题,它的考点不只是“链表操作”,还包括“迭代与递归的思维方式”“指针引用的使用”。你这样一拆,一道题就能复习到好几个知识点。

6.2 从试卷反推的备赛时间线

如果你现在离秋招还有两三个月,可以参考这个时间线来准备。当然,这只是我的经验,你可以根据自身情况调整。

第一个月,主攻数据结构和算法基础。按数组、链表、栈、队列、哈希、树、图、排序的顺序,把每个数据结构的基本操作和常见算法过一遍。这个阶段不求快,求扎实。每学一个数据结构,就刷对应的LeetCode题目10到20道。

第二个月,进入专项强化。操作系统、计算机网络、数据库三门课轮流复习,每门课用两周时间过一次核心知识点,配合每天1到2道算法题保持手感。同时开始看设计题,每天抽30分钟看一道电商场景设计题的优秀答案,学习答题框架。

第三个月,进入刷套题模式。每周做两套完整的模拟笔试,严格按照考试时间限制和答题节奏。刷完套题后,用上一节的三遍法认真复盘。这个月重点关注的是答题节奏、时间分配和心态稳定性。

6.3 几个真实的教训

最后分享几个我见过或者自己踩过的坑,希望对你有帮助。

第一个教训是,不要眼高手低。有位同学LeetCode刷了四百多道,觉得笔试稳了,结果试卷发下来,前几道选择题就把他难住了——他算法确实强,但计算机网络和数据库基本没复习,客观题错了一半,编程题再厉害也拉不回总分。笔试是综合能力的考察,木桶效应非常明显。

第二个教训是,一定要提前熟悉笔试系统。不同公司的笔试系统不一样,有些支持跳出题页,有些做了防切屏检测;有些支持本地IDE粘贴,有些禁止复制。提前用牛客网或者赛码网练几次模拟笔试,熟悉系统操作,不然考试时花了大量时间在系统操作上,就太冤枉了。

第三个教训是,注意时间分配。我个人的习惯是:客观题如果一道题超过90秒还没把握,先蒙一个答案并标记,最后有时间再回头验证。编程题每道题最多分配30分钟,超时就写暴力解保底。设计题至少留15分钟,即使写不完细致方案,也要把框架和关键词写上去。空着不写,一定是0分;写了关键词,可能就有分。

我自己的体会是,秋招笔试本质上是“有限时间内的综合能力展示”,它考的不只是你会不会某个知识点,还有你在压力下的判断力。拿到一套试卷,先花3分钟通读全卷,确认哪些题是送分题、哪些题是中等题、哪些题是难题。先保证送分题全部拿下,中等题尽量做得完整,难题能做多少做多少。这个策略听起来简单,但真正能做到的人并不多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询