小米2019秋招软件开发笔试题B深度解析:考点拆解与答题策略 📅 发布时间:2026/8/31 13:30:39 👁 浏览次数: 每年秋招季最容易被问到的开发岗笔试题目之一就是“小米2019秋招软件开发笔试题B”。这套题被很多同学私信讨论过也经常被拿来当模拟卷练习。我手头正好整理过这套卷子的考点也陪几届学弟学妹做过复盘今天就把我对这套B卷的理解、题目拆解和答题策略一次性说清楚。不保证能给你押中下一年的原题但只要你把这套题背后的考点逻辑吃透应付多数互联网公司的开发岗笔试都会从容不少。这套B卷整体上不是那种“偏怪难”的风格而是非常典型的“筛选型”试卷选择题覆盖面广、代码题考基本功、整体时间紧张但节奏可控。适合正在准备秋招、投递软件开发岗位的同学参考也适合想了解小米技术面试风格的人当作一个观察窗口。1. 整张试卷的风格与模块划分很多人拿到卷子第一反应是“怎么啥都考”数据结构、操作系统、网络、数据库、Java、计组全都有。其实这不奇怪B卷本来就不是为了考某一个语言或某一个方向的深度而是为了在有限的两个小时里快速判断一个人有没有计算机基础、有没有代码手感、能不能在压力下把题做出来。它要筛选的不是“某方面很牛的人”而是“各方面没有明显短板的人”。1.1 试卷模块与题量分布以我整理的版本来看B卷的题型大致分成这样几个模块模块考查内容题量占比核心目标选择题单选多选数据结构、OS、网络、数据库、Java基础约40%快速判断基础面编程题2~3道数据结构与算法、字符串/数组处理约40%现场写代码能力简答/设计题某些年份会出现偏向系统设计或场景题约20%判断工程思维这个比例并不是固定不变的但大体上一直是这个感觉。选择题多编程题占分高简答题看年份。从B卷的模块分布可以明显看出小米这套题对“代码能力”的看重是高于“背诵能力”的。选择题即便你不会蒙一个也有概率但编程题不会就是不会一道占20%的大题丢了基本就告别面试了。所以刷这张卷子时编程题永远是最优先攻克的。1.2 为什么B卷会这样出题我聊过的很多同学觉得奇怪为什么笔试不直接考项目、不考八股文而要搞这么多选择题和算法题我自己在负责过几轮校招面试之后对这个问题有了一个非常直接的答案笔试是用来做“减法”的。秋招投递量大简历筛选之后还有好几千人需要笔试面试官没有精力在笔试阶段去逐个看项目深度最公平、最有效率的方式就是用一套统一题目先把基础不过关、代码写不利索的人筛掉。B卷里那些选择题看似简单其实每一道都在帮你“暴露”知识盲区——有人栽在TCP握手状态有人栽在死锁条件有人栽在HashMap扩容。所以请不要觉得这套卷子“没考项目”就很水。它的水很深深在基础。2. 算法与数据结构核心得分区的拆题思路算法题永远是B卷里最刺激的部分。选择题你还能凭感觉选一选编程题那可是要真刀真枪敲代码的。而且小米的编程题有一个特点题目描述很短但坑很多。你以为你在做一道“简单题”结果边界条件没处理好直接挂掉一大半测试用例。2.1 字符串处理边界条件多到怀疑人生B卷里几乎每年都有字符串处理相关的题比如删除相邻重复字符、压缩字符串、判断子串、字符频次统计等等。这些题本身不难难在所有字符串题都容易栽在边界值上。举个例子我按B卷常见形态还原一道典型的题给定一个只包含小写字母的字符串 s要求删除所有相邻且相同的字符重复直到无法继续删除。返回最终字符串。例如输入 abbaca 返回 ca。这种题很多人第一反应是“循环删除直到没有相邻相同项”用 while 套 replace 的思路写结果超时。出题人预期你会用栈去解决。核心思路是这样的def remove_duplicates(s: str) - str: stack [] for ch in s: if stack and stack[-1] ch: stack.pop() else: stack.append(ch) return .join(stack)这道题的关键不只是“会不会用栈”而是你有没有考虑过连续三个相同字符的情况。如果你用“找到第一个相邻重复对就删一次”的思路处理 aabbb 这种用例时容易出问题。栈结构天然支持连续消除而且时间复杂度和空间复杂度都稳定在 O(n)。这类字符串题在考试时的价值是它不考复杂算法只考你处理边界条件的敏感度。很多人挂了之后看题解觉得“就这”对就是“就这”但你考试时没写对说明你平时编码习惯里缺少边界测试这一环。2.2 链表反转的变体区间反转链表在笔试里出现频率极高因为你没法用数组下标随机访问天然考察指针操作能力。B卷里常见的不是简单的整链反转而是区间反转——只反转从第 m 个节点到第 n 个节点之间的部分。我见过不少同学能写整链反转但到了区间反转就卡住因为需要同时维护四个关键节点区间前驱、区间起点、区间终点、区间后继。如果这四个节点的指针搞混链表就断了。这里给一个 Java 实现参考public ListNode reverseBetween(ListNode head, int m, int n) { ListNode dummy new ListNode(0); dummy.next head; ListNode pre dummy; for (int i 1; i m; i) { pre pre.next; } ListNode cur pre.next; ListNode next; for (int i m; i n; i) { next cur.next; cur.next next.next; next.next pre.next; pre.next next; } return dummy.next; }这个写法用头插法每次把 cur 后面的节点摘下来插到 pre 后面循环 n-m 次就完成区间反转。用 dummy 节点是为了处理 m1 时的边界情况这一点特别重要——很多同学忘了带头节点结果反转第一个节点时头指针丢失。2.3 动态规划与二叉树掌握套路就能拿分B卷的编程题最后一道经常是动态规划或者二叉树遍历的变体。动态规划的题不偏基本就是最长公共子序列、爬楼梯变体、背包问题这类入门级DP。很多人一看到 DP 就慌其实掌握“状态定义 状态转移 初始化”三步法大部分题都能解出来。比如背包问题的状态转移方程核心就是两种情况不选第 i 件物品或选第 i 件物品。写代码的时候先想清楚 dp[i][j] 代表什么再想状态怎么转移最后处理边界。只要这三步清晰代码就是顺水推舟的事。二叉树那块层序遍历、最大深度、最近公共祖先这类题反复出现的概率很高套路也比较固定把递归终止条件和返回值定义弄清楚就够了。3. 操作系统、网络与数据库背后逻辑比答案重要B卷选择题里操作系统、计算机网络和数据库大概占了一半。很多人觉得这部分就是死记硬背其实不然。小米出的基础题往往会在你熟悉的考点上换一个问法单纯背答案的人很容易看哪个选项都眼熟、选哪个都不确定。3.1 操作系统死锁、内存和线程是永远的主角操作系统考来考去就这么几块进程与线程、死锁、内存管理、虚拟内存、页面置换算法。B卷选择题最喜欢考的是死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待。另外操作系统题还有一个高频考法给你一个场景问你发生了进程调度还是线程切换、涉及内核态还是用户态。说到内存虚拟内存和页面置换算法是另一大考点。B卷对页面置换的考查力度很大但又不是让你直接默写 LRU 和 FIFO 的区别而是喜欢给你一串访问序列问你发生了几次缺页中断。这种题只能动手算不能凭感觉。我建议平时解题时宁可慢一点也要把访问序列一行一行画出来养成熟练的演算习惯。3.2 网络TCP连接与状态码不能只背不练由于研发岗日常写接口、调服务网络基础是必考的。B卷很喜欢考 TCP 三次握手和四次挥手的状态变迁尤其是 TIME_WAIT 状态存在的意义。有同学会疑惑为什么握手是三次、挥手是四次这类题答题的关键在于理解“双方各自关闭连接”的机制。握手时双方可以同时发送 SYN所以三次就够了挥手时双方的数据发送是独立关闭的所以需要四次。另外HTTP 状态码也是B卷选择题的常客。502、504、301、302、401、403这些常见状态码的含义必须非常敏感。我见过不少人把 302 和 304 搞混把 401 和 403 搞混这其实是非常基础的工程素养。后端开发日常排查接口问题没有这些状态码的直觉效率会非常低。3.3 数据库索引与事务隔离级别的“送分题”数据库的选择题通常集中在索引和事务。索引方面常考“为什么用 B 树而不是 B 树”这类经典问题事务方面则常考 ACID 和四种隔离级别。注意B卷特别喜欢把隔离级别和具体并发问题绑定来考脏读对应 Read Uncommitted不可重复读对应 Read Committed幻读对应 Serializable 或者通过 MVCC 解决。SQL 书写题偶尔会出现但不会太难基本是 GROUP BY 和 JOIN 的组合。这里有一个踩坑点很多人在自己的开发环境里写 SQL 习惯用 select *但笔试判分时关注的是你有没有用到正确的聚合函数和分组条件最好提前养成写明确列名的习惯。4. 语言特性与JVM考点B卷里的“技术栈关卡”虽然软件开发岗没有限定必须是 Java但小米笔试B卷里 Java 相关的选择题比例相当高。这说明什么说明他们默认多数候选人以 Java 为主要开发语言。如果你本身是 C 或 Python 方向至少也要把 Java 的容器、集合、并发基础补一补不然选择题会非常吃亏。4.1 HashMap、ConcurrentHashMap这些“必问容器”Java 集合框架是B卷的重中之重。HashMap 的底层结构、put 流程、扩容机制、为什么线程不安全、为什么容量是2的幂这些都属于“高频标配”。B卷一般不会直接问“HashMap 原理是什么”这种大而空的问题而是喜欢出细节题HashMap 在 JDK 1.7 和 1.8 之间有什么变化链表转红黑树的阈值为什么是8ConcurrentHashMap 在 JDK 1.8 里如何保证线程安全。关键提示如果你准备小米笔试HashMap 和 ConcurrentHashMap 这一对兄弟建议对比着看。JDK 1.7 的 ConcurrentHashMap 用的是分段锁JDK 1.8 用的是 CAS synchronized Node 数组。这两个版本的演进本质上反映了并发编程从“细粒度锁”到“无锁 局部锁”的优化思路。4.2 JVM与GC的快速复习路径B卷对 JVM 的考查通常集中在内存区域划分和垃圾回收算法。常见的问法是哪些区域是线程共享的、哪些是线程私有的对象在堆区怎么分配Minor GC 和 Full GC 的区别常见的垃圾回收器有哪些CMS 和 G1 有什么不同。关于 JVM 这部分我建议复习时不要只背概念最好画一张 JVM 内存模型图把堆、方法区、虚拟机栈、本地方法栈、程序计数器的位置关系搞清楚。选择题如果考“哪个区域会抛出 OutOfMemoryError”之类的题你脑子里有图画基本就不会错。GC 那部分也不用把每个垃圾回收器的参数背下来抓住“引用计数法不可靠、可达性分析是主流”这个逻辑主线再记一下 G1 的 Region 划分和可预测停顿模型就够了。4.3 设计模式和 Spring 常见的“工程题”B卷有时候会以接口设计、场景题的形式考查设计模式。比如给你一个需求让你选择最合适的设计模式。单例、工厂、策略、观察者这四个模式出现的概率最高。别死记硬背类图关键是能说出使用场景。比如一个支付系统要接入微信、支付宝、银行卡你会选择策略模式而不是写一大堆 if-else。这种题没有标准代码但你的答案里有没有“可扩展”“开闭原则”的意识直接决定了得分。Spring 相关的选择题偶尔也会出现比如 IoC 和 AOP 的本质是什么、Bean 的作用域有哪些。这种题不需要你背 Spring 源码但至少要理解控制反转把对象的创建和依赖关系交给容器管理能够用生活中的例子解释——比如你不必自己买菜做饭而是告诉餐厅你想吃什么餐厅做好端给你。这就是 IoC 的直观感受。5. 实操流程从读题到提交的标准化动作笔试拼的不只是“会不会”还有“在限定时间内能不能稳定输出”。我见过太多人题型都会但时间分配一团糟前两道题死磕太久最后一道大题根本没时间写。所以我把这套B卷的时间分配和答题流程单独拿出来讲这部分非常重要。5.1 两小时答题时间表根据这套B卷的题量我建议按照下面这个节奏来走时间段任务注意事项前5分钟快速浏览全部题目给每道编程题预估难度标记哪些题可以后置第5~40分钟完成选择题不会的题先标记跳过不要恋战第40~90分钟主力解决编程题优先做“有清晰思路”的题每题留15-30分钟第90~110分钟检查选择题 补编程题边界检查是否漏题、代码能否通过手写样例最后10分钟提交前整体确认确认代码编译通过、没有明显语法错误这个时间表的核心思想是编程题要留足时间选择题不要“死磕”。一道选择题纠结超过三分钟性价比已经很低了。宁可蒙一个标注一下也不要因为一道1.5分的题耽误后面20分的大题。5.2 编程题提交前的自查清单很多人提交代码前完全不自查以为本地跑过就算了。但笔试环境往往和你本地的 IDE 不一样编译器版本、JDK 版本、输入输出格式都可能造成“本地能跑、提交就挂”。我建议每次提交前都按照下面这份清单过一遍代码是否能编译通过有没有未使用的 import 和明显的语法错误。是否使用了与题目匹配的类名和方法名笔试环境通常要求 public class Main 和 main 方法。边界值是否考虑空字符串、负数、重复元素、长度极大值、n0 或 n1。是否用题目给出的样例跑过一遍并手动推导一次输出。有没有在代码里写死样例数据的“作弊”行为。提示不要小看“用题目的样例跑一遍”这一步。我见过不少人考试时思路没问题但输入输出格式不对导致零分。比如题目要求输出结果占据一行结果你多打印了一行日志。笔试环境的判分是严格匹配输出的多一个空格都可能判错宁可在输出前用一个 trim() 或 strip() 确保干净。6. 高频失分点与笔试后的复盘价值最后这部分我想聊聊那些“明明会但丢了分”的场景。每次帮人复盘校招笔试我都能从这些人身上看到非常相似的问题。如果你正在准备类似岗位的笔试下面这些坑请务必避开。6.1 五个高频失分点第一个失分点是选择填空不检查。很多人觉得选择题简单做完就急着去做编程题结果到最后没有时间回来复查。其实选择题里最容易出错的往往是最基础的题比如 TCP 的 TIME_WAIT 状态持续时间、IPv4 地址位数、数据库隔离级别。这种题不是你不会而是你在紧张状态下容易看走眼把“错误的是”看成“正确的是”。第二个失分点是算法题只写核心逻辑不写完整结构。有些同学平时刷题在 IDE 里只写方法体到了笔试要求写完整读写输入结果在主函数和输入解析上浪费了大量时间。建议平时刷题时就按照笔试环境的要求练习从输入读取到输出打印的完整代码。第三个失分点是没用好草稿纸。你可能会笑都什么年代了还草稿纸。但实际上对于链表反转、动态规划这类题在草稿纸上画一画指针走向、状态转移表比直接埋头写代码快得多。B卷的网络题里如果有缺页中断计算动手在纸上画访问序列也很重要单纯靠记忆硬算非常容易错。第四个失分点是忽略语言差异。比如 C 的 vector 和 Java 的 ArrayList 扩容机制不同如果你用 C 写代码vector 的扩容通常是 capacity 翻倍但并不是所有环境下都严格翻倍如果你用 Pythonlist 的底层是对象数组切片操作会生成新列表。这些语言细节在编程题里如果不注意很可能导致超时或者意外的内存开销。第五个失分点是心态崩了之后乱改答案。我见过很多同学编程题卡了一道回头把本来选对的选择题改错了。这种情况非常可惜。笔试时间紧张人的判断力会受到压力影响没有明确把握的答案建议保持第一直觉。6.2 从笔试到面试复盘的价值很多人把笔试当成一个“结果”挂就挂了过就过了完全没有复盘。这是一个很大的浪费。小米的面试官手里是有你的笔试记录和代码的面试环节经常会拿你笔试时写的代码来追问你当时为什么这么写考虑到什么情况有没有更好的优化方案这其实是面试官在考察你的思考过程和工程意识。如果你笔试时写了一道暴力解法至少要在面试前思考一下有没有更优的解法如果你有一道题没写出来也要在笔试后把标准答案弄懂。这不是为了应付“同一道题”而是为了在面试时被问到相关内容时能及时接上话。回归到这套 B 卷本身你会发现它真正想告诉你的只有一句话基础不牢地动山摇。两小时做几十道题没有太多时间给你临场发挥和“灵光一现”真正决定你能不能过的是你在过去几年里有没有把数据结构、操作系统、网络、数据库这些核心基础真正学扎实。如果有同学正在准备类似岗位的笔试我只有一句建议不要背题也不要背答案。把每一道题都当成面试官站在你旁边看你写代码写完能说出你做了些什么、为什么这么做、边界条件考虑在哪里。这套题筛掉的从来不是基础弱的人而是没有复盘习惯的人。