数据来源:真实面经整理 | 版本:final
一、公司画像 & 校招节奏
小米成立于,总部北京,是全球领先的消费电子和互联网服务公司。从最初一款手机起步,到现在覆盖手机、IoT智能家居、互联网服务,再到正式交付的小米SU7电动车,小米的业务版图已经扩展到汽车行业。
小米营收约2709亿元,全球员工超3.5万人。MIUI(现已升级为HyperOS)月活用户超6亿。对于应届生来说,小米的吸引力在于:工程师文化浓厚、节奏快、晋升路径清晰,薪资水平对标字节一线大厂。
主要招聘岗位:
| 岗位方向 | 主要技术栈 | 竞争难度 |
|---|---|---|
| 后台开发 | Go / C++ / Java | ⭐⭐⭐⭐ |
| 客户端/Android开发 | Java / Kotlin + C++ | ⭐⭐⭐⭐ |
| 系统软件(BSP/驱动) | C / C++ | ⭐⭐⭐⭐⭐ |
| IoT/智能家居方向 | Go / C++ + 嵌入式 | ⭐⭐⭐⭐ |
| 小米汽车软件(新方向) | C++ / Python / 车载系统 | ⭐⭐⭐⭐⭐ |
| 前端开发 | JS / TS + React / Vue | ⭐⭐⭐ |
| 测试开发 | Python / Java + 自动化测试 | ⭐⭐⭐ |
| 算法工程师 | Python + ML/CV/NLP | ⭐⭐⭐⭐ |
校招节奏(参考):
上旬 暑期实习生批次,优先留用转正
中旬 正式网申开放 → xiaomi.jobs
在线笔试(算法+专业基础)
技术面试(2-3轮)+ HR面
Offer发放
竞争现实:小米算法难度整体比字节、腾讯略低,但对编程工程能力和系统理解要求不低。后台和系统软件方向竞争激烈,Android/客户端方向因小米本身手机业务体量大,岗位相对充足。小米汽车方向是起新增,正在快速扩编,是一个值得关注的机会窗口。
二、岗位 JD 解析:技术要求拆解
通用核心要求
| 能力维度 | 具体要求 | 备考权重 |
|---|---|---|
| 编程能力 | C++/Go/Java 至少一门熟练,能手写 | ⭐⭐⭐⭐⭐ |
| 算法数据结构 | 基础扎实,能现场编码 | ⭐⭐⭐⭐⭐ |
| 操作系统 | 进程/线程、I/O模型、内存管理 | ⭐⭐⭐⭐⭐ |
| 计算机网络 | TCP/IP、HTTP、WebSocket | ⭐⭐⭐⭐ |
| 数据库 | MySQL基础 + Redis | ⭐⭐⭐ |
| 工程实践 | 项目经验、代码质量、Fast Iteration | ⭐⭐⭐⭐ |
各岗位差异速览
后台开发:小米后台技术栈以 Go 为主(微服务体系),C++ 用于性能敏感场景,Java 也有大量存量服务。面试重点:并发模型、微服务设计、Go 的 goroutine 调度、网络编程。
Android/客户端开发:MIUI/HyperOS 的核心是 Android 深度定制。除了标准 Android 知识(四大组件、性能优化、Binder 机制),小米会考察系统层的理解:Framework 层、JNI、C++ NDK 开发能力加分。
系统软件:这是小米特有的岗位方向,主要做手机底层(BSP、驱动、内核适配)。要求 C/C++ 扎实,熟悉 Linux 内核,了解 ARM 架构。难度最高,但招聘竞争相对小。
IoT/智能家居方向:考察重点包括 MQTT 协议原理、设备接入、边缘计算基础。小米生态链设备超3亿台,IoT 后台是核心基础设施,长期有招聘需求。
小米汽车软件(新方向):主要考察车载操作系统基础(AUTOSAR/Android Automotive)、C++ 系统编程、功能安全(ISO 26262)基础了解。这个方向目前竞争者少,技术门槛高,是差异化竞争的机会。
关键洞察:小米面试官普遍有"工程师文化"认同——他们看重候选人能不能真正上手做,而不只是背答案。项目经验里的细节(为什么这样设计、遇到了什么坑、怎么优化的)比堆砌技术名词更重要。
三、LeetCode 高频题 Top 20(真实面经数据)
以下题目按真实面经出现频次排序,覆盖后台、客户端、系统软件主要岗位。
🔴 第一梯队:必刷(极高频)
1. 反转链表(No.206)⭐⭐⭐⭐⭐
- 考察频次:全岗位第一高频,几乎每轮都会出现某种变体
- 难度:Easy
- 核心思路:迭代法(三指针)或递归法,两种都要掌握
- 常见变体:反转链表 II(区间反转 No.92)、K个一组翻转(No.25)、判断回文链表(No.234)
- 备考提示:会被要求"不用递归写一遍",再"用递归写一遍"。不只要能写,要理解指针变化的过程,能画图讲清楚
2. LRU缓存(No.146)⭐⭐⭐⭐⭐
- 考察频次:系统设计感最强的编程题,后台方向必考
- 难度:Medium
- 核心思路:哈希表(O(1)查找)+ 双向链表(O(1)移动节点),两者组合
- 常见追问:如何改造成线程安全的LRU?LFU怎么实现?缓存击穿/穿透怎么处理?
- 备考提示:这道题要能白板手写完整实现,不能有语法错误。小米面试官特别喜欢问"为什么用双向链表而不是单向链表",要能解释清楚
3. 手撕快排⭐⭐⭐⭐⭐
- 考察频次:C++方向几乎必考,有时以"实现一个高效排序"的方式提问
- 考察重点:pivot选择、partition实现、递归边界
- 常见追问:快排最坏情况是什么?如何优化到O(nlogn)期望时间?和归并排序的区别?
- 备考提示:重点是partition函数的实现,要理解双指针的交换逻辑,不能死记
4. epoll/select/poll区别(系统编程必考)⭐⭐⭐⭐⭐
- 考察形式:通常是问答题,但有时会出"手写一个简单的事件循环"
- 核心知识:select(位图,1024上限)→ poll(pollfd数组,无上限但仍O(n))→ epoll(红黑树+就绪链表,O(1),支持ET/LT模式)
- 常见追问:epoll的LT模式和ET模式区别?为什么Nginx选用epoll+ET?
- 备考提示:这是小米系统编程方向的核心考点,要理解底层机制,不能只背结论
🟠 第二梯队:高频必练
5. 二叉树层序遍历(No.102)⭐⭐⭐⭐
- 难度:Medium
- 核心思路:BFS + 队列,注意每层节点数的控制
- 变体:No.103(锯齿形层序)、No.107(从底到顶)
- 备考提示:层序是二叉树的基础,要能秒写
6. 二叉树最大深度(No.104)⭐⭐⭐⭐
- 难度:Easy
- 核心思路:DFS递归(后序遍历)或BFS
- 常见变体:No.111最小深度、No.543直径
- 备考提示:DFS的递归思路要能解释"为什么这样写是正确的"
7. 二叉树最近公共祖先(No.236)⭐⭐⭐⭐
- 难度:Medium
- 核心思路:后序遍历,判断left/right是否找到目标节点
- 常见追问:如果是BST怎么做(No.235)?如果有父节点指针怎么做?
8. 无重复字符最长子串(No.3)⭐⭐⭐⭐
- 难度:Medium
- 核心思路:滑动窗口 + 哈希表记录字符位置
- 备考提示:滑动窗口的模板题,要理解窗口左边界的更新逻辑
9. 两数之和(No.1)⭐⭐⭐⭐
- 难度:Easy
- 核心思路:HashMap一次遍历,O(n)时间
- 变体:三数之和(No.15)、四数之和(No.18)
- 备考提示:简单题不能有任何瑕疵,要能秒写
10. 合并区间(No.56)⭐⭐⭐⭐
- 难度:Medium
- 核心思路:先按起点排序,再一次遍历合并重叠区间
- 备考提示:小米后台面经出现频次较高,排序+遍历的思路要清晰
🟡 第三梯队:中等频次,有余力必刷
11. 最长上升子序列(No.300)⭐⭐⭐
- 难度:Medium
- 两种解法:DP O(n²) 和 贪心+二分 O(nlogn),两种都要掌握
12. 螺旋矩阵(No.54)⭐⭐⭐
- 难度:Medium
- 核心:模拟四个方向的边界收缩,容易写出死循环,要反复练
13. 爬楼梯(No.70)⭐⭐⭐
- 难度:Easy
- 本质:斐波那契数列,DP入门题
- 备考提示:常作为"热身题"出现,要能30秒内写完
14. 零钱兑换(No.322)⭐⭐⭐
- 难度:Medium
- 核心思路:完全背包DP,注意状态转移方程
15. 相交链表(No.160)⭐⭐⭐
- 难度:Easy
- 核心思路:双指针走两条路径,长度自动对齐
16. 有效括号(No.20)⭐⭐⭐
- 难度:Easy
- 核心:栈匹配,常作为热身题
17. 买卖股票最佳时机(No.121)⭐⭐⭐
- 难度:Easy
- 变体:No.122(多次买卖)、No.123(最多2次)
18. 二分查找(No.704)+ 系列⭐⭐⭐
- 难度:Easy
- 重点:边界条件,
left <= right还是left < right,是减1还是不减
19. 最大子数组和(No.53)⭐⭐⭐
- 难度:Easy
- 核心:Kadane算法,DP的经典应用
20. 环形链表(No.141 + No.142)⭐⭐⭐
- 难度:Easy/Medium
- 核心:快慢指针,142要找入环点
四、技术面试考点
C++ 核心考点
小米对C++的考察深度适中,不会像某些游戏公司那样考到模板元编程,但底层原理要扎实。
vector底层实现与扩容机制 这是C++里被问最多的容器题。核心要点:vector底层是连续内存数组,扩容时通常以1.5倍或2倍增长(实现相关),需要重新分配内存并移动元素。面试官会追问:为什么是1.5倍/2倍而不是定值?频繁push_back的性能问题怎么解决(reserve预分配)?
智能指针三兄弟
shared_ptr(引用计数,多所有权)、unique_ptr(独占所有权,不可复制)、weak_ptr(弱引用,解决循环引用)。小米特别爱考的是循环引用的场景:A持有B的shared_ptr,B持有A的shared_ptr,两者都无法析构,用weak_ptr打破循环。
类成员初始化顺序 初始化列表中的顺序是声明顺序,而不是初始化列表的书写顺序。这是一个经典坑,面试里经常以代码题形式出现:"这段代码输出什么?"
虚函数与多态 虚函数表(vtable)的存储位置,虚析构函数为什么必要,纯虚函数和抽象类的使用场景。
move语义和右值引用(C++11)
std::move的本质(强制转为右值引用),移动构造函数和复制构造函数的区别,NRVO(具名返回值优化)。
Go 核心考点
Go是小米后台的主流语言之一,面试不深挖语言边角,但基础原理要清楚。
slice vs array
slice底层是结构体:指向底层数组的指针 + len + cap。append超过cap时会重新分配内存,原slice不受影响。常见考题:函数传slice修改元素为何会影响原slice,但append不会?
map基本原理
Go map底层是哈希表+桶结构。重点:Go map不是并发安全的,多goroutine同时读写会panic。并发场景用sync.Map或加互斥锁。
goroutine调度(GMP模型) G(goroutine)、M(OS线程)、P(处理器,逻辑CPU)三者关系。面试通常不会让你背完整源码,但要能解释"goroutine比线程轻量在哪里":栈默认2KB可动态增长(线程通常1-8MB固定),调度在用户态完成(避免内核切换开销)。
channel的使用场景 goroutine间通信的首选,理解有缓冲和无缓冲的区别,以及select的多路复用。
操作系统核心考点
epoll的LT模式和ET模式 LT(Level Triggered,水平触发):只要缓冲区有数据就持续通知,默认模式,使用简单。ET(Edge Triggered,边缘触发):只在状态变化时通知一次,需要循环读到EAGAIN。Nginx使用ET模式,性能更好但实现复杂。
进程和线程的区别 进程是资源分配单位,线程是CPU调度单位。同进程的线程共享内存空间、文件描述符等。进程切换开销更大(需要切换页表),线程切换只需保存/恢复寄存器上下文。
死锁四个条件 互斥、占有并等待、不可抢占、循环等待。四者同时满足才会死锁,预防死锁就是破坏其中一个。
内存管理 虚拟内存、分页机制(TLB加速)、缺页异常处理。这类题通常配合"程序的内存布局"一起考(代码段、数据段、堆、栈、内核空间)。
计算机网络核心考点
TCP三次握手/四次挥手 三次握手:SYN → SYN-ACK → ACK。为什么是三次:确保双方都知道对方能发能收。四次挥手:FIN → ACK → FIN → ACK,TIME_WAIT的作用(确保最后ACK到达、让旧连接的报文消失)。
HTTP vs HTTPS HTTPS = HTTP + TLS。TLS握手过程(RSA或ECDHE密钥协商),对称加密和非对称加密分别用在哪里,证书链验证。
WebSocket 为什么需要WebSocket(HTTP的半双工局限),WebSocket握手过程(基于HTTP Upgrade),与HTTP长轮询的对比。小米IoT方向可能重点考这里。
MQTT协议(IoT方向重点) MQTT是轻量级的发布/订阅协议,专为低带宽、不稳定网络设计。QoS三个级别(0至多一次、1至少一次、2恰好一次),适合IoT设备通信场景。
Android方向核心考点(仅Android岗)
Activity生命周期 onCreate → onStart → onResume(前台运行)→ onPause → onStop → onDestroy。横屏切换会重建Activity(可用onSaveInstanceState保存状态)。
Handler消息机制
MessageQueue + Looper + Handler三者关系。主线程默认有Looper,子线程需要手动调用Looper.prepare()。为什么Handler可以更新UI(UI操作必须在主线程,Handler将消息抛到主线程的MessageQueue)。
RecyclerView原理 RecycledViewPool缓存机制,四级缓存(Scrap、Cache、RecycledViewPool、自定义)。DiffUtil的使用和原理(Myers算法计算最小编辑距离)。
Binder机制 Android特有的IPC机制,一次数据拷贝(mmap内存映射),比管道、Socket更高效。Service通过Binder提供跨进程接口。
五、面经规律总结
面试流程
小米标准流程是2-3轮技术面 + 1轮HR面:
- 一面:算法题2道 + 基础知识(重点考操作系统、数据结构)
- 二面:算法题1道 + 深入技术讨论 + 项目经历
- 三面(部分岗位):系统设计 + 综合能力考察
- HR面:意向确认、薪资沟通
小米面试的三个特点
特点一:节奏相对从容
相比字节和腾讯,小米面试节奏更像在"聊天"。面试官会给提示,不会让你完全卡住了就结束。如果你思路走偏,面试官会引导。这意味着沟通能力很重要——把你的思路说出来,比闷头写代码更好。
特点二:注重工程实践
项目经历是二面的核心。常见追问模式: - "你这个项目最大的技术挑战是什么?" - "你们的服务怎么保证高可用?" - "这里为什么选择这个技术方案而不是那个?" - "如果让你现在重做,你会改什么?"
没有做过完整项目的同学建议在备考期间把实验室项目或实习项目深入打磨,能讲清楚技术决策的来龙去脉。
特点三:多语言考察
小米是少数会同时考C++和Go的公司(根据岗位)。后台岗会问Go的goroutine和slice;系统软件岗会深挖C++的内存模型;Android岗会考Java/Kotlin加上C++ JNI。
建议根据投递岗位重点准备一门语言,但保持对另一门的基础了解。
高频被坑的地方
-
链表题画图要从第一步开始:反转链表写到一半指针指向混乱,是大多数人翻车的地方。建议每次做链表题都先画图。
-
epoll/select/poll分不清LT和ET:知道三者的大方向差异,但LT和ET的具体触发条件总是模糊。记住:LT是"只要有数据就告诉你",ET是"只在变化那一刻告诉你"。
-
Go map并发安全:这是最容易忽略的点。面试官问"Go map线程安全吗",很多人答了"安全",然后直接挂掉。答案是不安全,并发要用sync.Map。
-
智能指针循环引用:能背出三种智能指针的定义,但循环引用的场景没练过,遇到代码题会卡住。
-
项目经历太浅:能描述做了什么,但说不清楚"为什么这样做"和"遇到了什么问题"。这是工程师文化下的致命伤。
校招节奏
以下计划适合有基础(C++/Go其中一门较熟,学过基础算法)的同学,从零开始需要适当延长。
第一周:夯实算法基础()
每日目标:2-3道LeetCode + 1个知识点
| 日期 | 算法专题 | LeetCode题目 | 知识点 |
|---|---|---|---|
| 链表基础 | No.206、No.21、No.141 | 链表指针操作 | |
| 链表进阶 | No.92、No.25、No.142 | 快慢指针原理 | |
| 二叉树DFS | No.104、No.111、No.543 | DFS递归模型 | |
| 二叉树BFS | No.102、No.103、No.236 | BFS队列使用 | |
| 哈希表 | No.1、No.3、No.146 | HashMap设计 | |
| 排序 | 手撕快排、No.56、No.75 | 排序算法原理 | |
| 周复习 | 复刷本周错题 | 整理笔记 |
第二周:操作系统 + 网络 + 语言深入()
每日目标:1-2道LeetCode + 重点知识模块
| 日期 | 主题 | 核心内容 |
|---|---|---|
| 操作系统-进程线程 | 进程线程区别、上下文切换、死锁四条件 | |
| 操作系统-I/O | select/poll/epoll原理,LT vs ET | |
| 操作系统-内存 | 虚拟内存、分页、程序内存布局 | |
| 计算机网络-TCP | 三次握手/四次挥手,TIME_WAIT,拥塞控制 | |
| 计算机网络-HTTP | HTTP/1.1 vs HTTP/2,HTTPS原理,WebSocket | |
| C++核心 | vector扩容、智能指针、虚函数、move语义 | |
| Go核心 | slice/map原理、goroutine/GMP、channel |
第三周:动态规划 + 系统设计 + 项目准备()
| 日期 | 主题 | 核心内容 |
|---|---|---|
| DP基础 | No.70、No.53、No.121系列 | |
| DP进阶 | No.300、No.322、No.72 | |
| 系统设计基础 | LRU/LFU设计,分布式缓存基础 | |
| 系统设计进阶 | 消息队列原理(Kafka基础),微服务概念 | |
| 项目经历整理 | 用STAR法整理1-2个核心项目,准备追问 | |
| 二分+滑动窗口 | No.704、No.34、No.76 | |
| 周复习+模拟面试 | 全流程模拟一次技术面 |
第四周:冲刺 + 弱点补强()
| 日期 | 主题 |
|---|---|
| 刷完第一梯队所有题,每题能内写出 | |
| 刷第二梯队重点题,重点练追问场景 | |
| 根据投递岗位专项备考(Android岗补Handler/Binder,IoT岗补MQTT) | |
| 复习语言核心(C++或Go)所有考点,用自己的话能解释清楚 | |
| 复习操作系统+网络,重点巩固薄弱点 | |
| 全真模拟面试(找人mock或自己限时做题+解释) | |
| 休息+调整状态,确认投递信息和面试时间 |
最后一句话:小米面试不是考验你能背多少知识,而是考验你能不能清晰地思考和表达。把你的解题过程说出来,把代码的每一行写清楚,把项目里的真实决策讲明白——这就是小米工程师文化最看重的东西。
📚 你可能还需要这些
其他大厂备考攻略
备战多家公司?本合集已整理: - 📌 腾讯校招备考攻略(系统设计+C++深度考察) - 📌 阿里巴巴校招备考攻略(Java体系+分布式) - 📌 字节跳动校招备考攻略(算法难度最高) - 📌 百度校招备考攻略(AI+搜索方向重点) - 📌 美团校招备考攻略(Java后台+业务设计) - 📌 京东校招备考攻略(供应链+电商场景)
专项能力提升
- 📌 大厂C++技术面试常考题(智能指针/虚函数/STL底层)
- 📌 大厂笔试面试八股文-算法-数组常考题
- 📌 大厂校招求职备考攻略(通用方法论)
💡 关注我,少走弯路
我会持续分享: - ✅ 大厂高频题整理(按公司、岗位精准分类,不废话) - ✅ 最新面经汇总(持续跟进各厂最新考点) - ✅ 备考校招节奏(不同基础的同学对应不同方案) - ✅ 校招内推信息(不定期更新)
这份攻略整理了大量真实面经数据,如果对你有帮助: - 👍 点个"赞"和"在看",让更多备考的同学看到 - 💬 评论区告诉我你在备考哪家公司,我来重点整理 - 🔄 转发给一起备战校招的朋友
有问题随时留言,祝你顺利拿到小米Offer!