ARTICLE DETAIL

资讯详情

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

小米前端秋招笔试全解析:题型考点与备战策略

小米前端秋招笔试全解析:题型考点与备战策略 又是一年秋招季。在牛客、知乎、脉脉上刷到不少关于小米前端笔试的讨论正好今年身边有几个学弟学妹也投了小米第一批笔试刚结束他们回来跟我复盘了整整一个下午。结合我自己前两年参与校招笔试出题和面试的经验以及带过的实习生反馈我打算把这场笔试的考察逻辑、典型题目和准备思路完整梳理一遍。如果你正准备投小米或者其他大厂的前端岗这篇文章应该是你在刷题之外非常值得花半小时读完的一份参考。先说结论小米前端第一批笔试的难度在互联网大厂里属于中等偏上整体风格偏向“基础扎实度优先工程实践次之算法强依赖Thinking能力”。笔试系统使用的是牛客的在线评测平台双机位监控时长120分钟题型分布大约为单选10题、多选5题、编程题2题有的批次是3题看岗位方向、简答或设计题1题。后面我会逐个拆解。1. 笔试基本信息与整体流程复盘1.1 笔试入口与时间安排小米的秋招笔试通知一般会提前3到5天发到你的邮箱和短信同时手机短信里会附带一个牛客网的笔试链接。要注意的是这个链接是一人一链的不要转发给其他人也不要试图用同一个链接在两个设备上登录很容易被系统判定为作弊嫌疑。笔试时间是固定的晚上19:00到21:00全国统一不存在你选择场次的问题。第一批笔试通常在简历投递截止后一周左右进行时间比较紧凑所以如果你投了简历最好立刻开始准备笔试不要等通知下来再动手。我当时给学弟学妹强调过一个细节提前20分钟进入笔试房间做设备检测和人脸识别。牛客的在线笔试系统会要求你开启摄像头并且在开考前会拍一张你的正脸照片作为身份核验。如果你的电脑没有摄像头或者摄像头驱动有问题一定要提前处理否则开考后再调试设备会白白浪费宝贵的答题时间。1.2 题型分布与分值占比从今年第一批笔试的情况来看题型和分值与最近两年基本保持一致但有细微变化。我用表格整理一下题型题量单题分值总分考察重点单选题102分20分JS基础、CSS、浏览器、网络多选题54分20分框架原理、工程化、性能优化编程题220分40分数据结构、算法、代码实现简答/设计题120分20分系统设计、场景方案、表达逻辑总分100分但注意笔试成绩不会直接换算成通过率更多是作为面试官综合评估的一个参考维度。也就是说并不是考到60分就一定进面试考的排名和简历匹配度同样重要。这一点很多人会忽略总觉得笔试就是分数游戏其实不是。分值上最值得关注的是编程题占了40分一题20分权重很高。两道编程题的难度差异通常比较大第一题是“热身难度”第二题是“分水岭难度”。后面我会专门讲这两道题怎么规划作答顺序。多选5题20分看似占比不高但扣分机制比较坑。今年第一批的多选题中有一个明显的规则少选得部分分错选不得分。很多同学多选题只敢选一个最确定的选项结果每题只拿一两分5题加起来损失惨重。我的建议是在不能完全确定的情况下至少选出你有80%把握正确的选项因为多选少选的收益期望是正的而错选的概率可以通过审题控制住。1.3 笔试环境与工具准备这里必须多说一句很多人在笔试前完全不检查浏览器环境。小米的笔试明确要求使用Chrome或者Edge的最新版本不支持IE和Safari。如果你用的是360浏览器或者QQ浏览器的兼容模式很可能出现代码编辑器无法正常高亮、代码粘贴不进去、甚至无法编译的问题。笔试过程中网页会锁定不允许切屏、不允许打开其他标签页、不允许使用本地IDE。这个锁定并不是完全禁止你切出去而是每次切屏都会被系统记录一次切屏次数超过一定阈值通常是5次会自动交卷。所以如果你习惯在本地编辑器里写好代码再黏贴上去要提前练习直接在线评测环境里写代码包括适应没有ESLint、没有自动补全的环境。再一个容易忽略的是网络环境。牛客的在线评测对网络稳定性要求不低尤其是代码编译和提交时网络抖动可能导致提交失败、代码丢失。我建议笔试时用网线直连不用WiFi如果只能用WiFi尽量靠近路由器并关闭路由器上所有其他高带宽业务。这不是小题大做我见过太多人因为提交时网络卡顿而心态爆炸。另外提前在电脑上装好牛客的客户端插件这个插件是用于防作弊的开考前会要求你安装并运行。第一次安装可能需要两分钟左右别等开考了才弄。2. 核心考点详解八股与基础理论2.1 JavaScript核心机制闭包、原型链与异步小米笔试的选择题中JavaScript部分通常占4到6题是最核心的板块。考察范围看似宽泛但高频考点非常集中我按出现概率排个序**事件循环Event Loop**是几乎每场必考的。今年第一批考了一道经典的混合输出顺序题大概长这样一个同步代码块里嵌入setTimeout、Promise.resolve().then、async/await、微任务队列和宏任务队列的嵌套让你写出输出顺序。这道题考察的不只是”微任务先于宏任务“这个口诀而是考察你对async/await在await那一刻的语义理解。很多人只知道await后面是微任务但忽略了await右边表达式如果是Promise会把await之后的代码整体放入微任务队列而且这个微任务会排在当前同步任务结束之后、下一个宏任务之前。我自己总结了一个简化理解模型适合笔试快速推导同步代码永远先执行执行完毕后再依次清空微任务队列微任务队列空了之后从宏任务队列取出一个任务执行执行完再清空微任务队列如此循环。用这个模型去推导即使遇到复杂的嵌套也不会乱。原型链与new的考察频率也很高。比如面试题”new一个构造函数的过程中发生了什么”这个基本是必背的创建一个新对象、该对象内部的原型指针指向构造函数的prototype、构造函数内部的this绑定到新对象、如果构造函数本身没有返回对象则返回这个新对象。小米喜欢在此基础上加一个变体——如果构造函数显式返回了一个基础类型那么返回值会被忽略返回的是新对象如果显式返回了一个对象那么返回的是这个对象。很多人只知道前半句不知道后半句遇到变体就丢分。闭包在这一批笔试中出现在一道多选题里题干是描述一段代码的执行结果和内存占用情况选项涉及闭包在循环中如何捕获变量、let和var的区别、以及闭包导致的内存泄漏问题。值得注意的是选项里出现了”闭包一定会导致内存泄漏“这种错误说法用来筛选那些概念不够精确的人。其实只有闭包中引用了不再使用的DOM节点或大数据对象且没有主动释放时才会出现内存泄漏。闭包本身是语言特性不是毒药。2.2 CSS布局与浏览器渲染原理CSS在小米笔试中占比不大通常只有2到3题而且难度分化严重。基础题考的是Flex和Grid的属性记忆难点题则偏向”为什么“的层面。我印象比较深的是今年有一道关于**CSS像素与DPR设备像素比**的题题干是讲一个300px宽的容器在DPR为2的Retina屏幕上渲染实际占用的物理像素是多少。这题其实考察的就是物理像素CSS像素×DPR这个概念属于移动端适配的基础。但很多人刷面试题的时候只背了viewport、rem、vw这些方案反而基本原理没搞懂容易在这类题上失手。另一类高频考点是重排Reflow与重绘Repaint以及如何触发GPU加速。小米的题偏向实际场景给一段频繁修改DOM的代码问你如何优化减少重排。答案很容易背比如用DocumentFragment、用transform替代top/left、批量修改样式类名等。但笔试中更可能考的是反向题——下列哪些操作会触发强制同步布局选项包括读取offsetHeight、offsetTop、getComputedStyle等。这个就需要你理解浏览器渲染队列的概念了。2.3 Vue/React框架原理与工程化框架部分的考察重心小米这几年一直是Vue和React并重的。虽然小米内部部分团队在用Vue部分在用React但笔试阶段不会偏袒任何一方两者的原理题都会出现。Vue的常考点是响应式原理。今年考了一道关于Vue3的题目问的是”ref和reactive在响应式追踪上的本质区别”这题考的就是Proxy和Object.defineProperty。选项里有“ref内部实现就是reactive”这个说法其实是不严谨的——ref在对象类型上确实调用了reactive来包装但ref单独处理了基础类型的劫持通过Getter/Setter来追踪依赖不能简单说ref就是reactive。React的常考点集中在Hooks的执行原理和Fiber架构。有一道多选题问到useEffect的依赖数组是空数组和依赖了某个state时的执行时机差异以及StrictMode下为什么Effect会执行两次。这里要明白开发模式下StrictMode会故意模拟组件卸载后重新挂载来暴露副作用中的内存泄漏问题。所以Effect执行两次并不是bug而是开发模式的特性。工程化部分今年考了Webpack的Loader和Plugin的区别、tree-shaking的前提条件、Vite的依赖预构建原理。其中tree-shaking那道题比较有区分度——题干是一段ESModule代码问哪个导出方式能被tree-shaking掉。这里的关键是tree-shaking依赖静态分析所以import必须写在顶层且不能使用CommonJS的require。如果你平时写代码习惯混合模块规范这题很容易选错。3. 算法题与手写代码高分关键3.1 算法题难度分层与高频考点小米的第一批笔试编程题第一题通常是字符串或数组处理难度基本在LeetCode简单偏中等考察的是基本的编码能力和边界处理。第二题则明显提高难度今年考的是与树遍历结合的状态动态规划需要你在理解题意后自己定义状态转移方程难度在LeetCode中等偏上。我统计了一下近两年小米前端笔试的算法考点分布出现频率比较高的是二分查找的变体、链表翻转类操作、字符串匹配偶尔会要求手写KMP、二叉树遍历的迭代写法、动态规划背包和路径类居多。这跟阿里、字节的笔试风格比较接近但比腾讯的笔试更偏向算法本身而不是纯粹的工程场景。有一个很重要的备考误区前端岗笔试算法题根本不会考到红黑树、B树、最小生成树这种偏后台的数据结构但为什么还有很多人栽在算法题上因为他们在LeetCode上只刷热门题不刷基础题导致基础数据结构的手写能力退化。比如让你手写一个链表反转大部分人都能用递归写出来但让你用迭代加上多种边界条件去写很多人反而会卡壳。3.2 高频手写代码题与实现示例除了在线评测的编程题小米笔试偶尔会在选择题或简答题里考察手写代码的判断题——不让你现写而是给一段有问题的代码让你选哪里会报错或输出异常。这种题目更考验对代码细节的记忆和判断能力。根据我和学弟学妹的复盘比较容易出现在笔试里的手写代码片段包括防抖与节流// 防抖触发后延迟执行延迟期间再次触发则重新计时 function debounce(fn, delay) { let timer null; return function (...args) { if (timer) clearTimeout(timer); timer setTimeout(() { fn.apply(this, args); }, delay); }; } // 节流时间不超过一定间隔时只执行第一次 function throttle(fn, interval) { let last 0; return function (...args) { const now Date.now(); if (now - last interval) { last now; fn.apply(this, args); } }; }这两个实现几乎是前端笔试手写题的“必背”级别。笔试时如果给的是代码判断考察点通常在this的绑定和是否使用了箭头函数导致this丢失。很多人写防抖的时候在内部函数里用了箭头函数返回的wrapper函数中args又没有被正确透传就会导致this指向错误。深拷贝function deepClone(obj, map new WeakMap()) { if (obj null || typeof obj ! object) return obj; if (map.has(obj)) return map.get(obj); const clone Array.isArray(obj) ? [] : {}; map.set(obj, clone); for (let key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { clone[key] deepClone(obj[key], map); } } return clone; }这个版本虽然是手写题的“标准答案”但在笔试环境中你如果想在编程题里用到它要注意一个细节WeakMap不能遍历但可以用来记录已经拷贝过的对象引用解决循环引用问题。如果不用WeakMap而用普通对象或者Map虽然也能实现但内存上的差异在面试官的追问环节可能成为劣势。3.3 编程题的做题顺序与提交策略编程题做题顺序是一个非常现实的策略问题。我的建议是先做第二题再看第一题——不是让你先写第二题而是先花两到三分钟把两道题都看一遍。第一题虽然简单但有时题干描述很长容易让你在阅读理解上浪费大量时间第二题虽然难但有时候题干很短你可以快速判断是否是自己熟悉的状态压缩或树形DP模型。如果第二题你在5分钟之内完全没有思路果断放弃把时间全留给第一题和第二题的暴力解法。暴力解法虽然不能拿满分但通常能拿50%到70%的测试点分数比空着交卷强得多。小米笔试的判分规则是按测试点给分的每道题会隐藏若干测试点通过部分测试点能给部分分这一点比一些“非AC即零分”的笔试要人性化。我在复盘时给学弟学妹总结了一个暴力解法的框架先确认数据范围如果n 1000直接O(n^2)的暴力基本能过n 100000O(n^2)大概率超时但你仍然可以先把答案算出来提交一次看能过哪个测试点再针对小数据专门优化。这里的核心是别纠结“完美解”先把有把握的分拿到。4. 实战模拟一套典型笔试题目精讲4.1 选择题精讲从一题看一类我拿一套在牛客上被反复讨论的小米前端笔试模拟题来做个精讲通过一道题串起一类知识点。题目下列代码执行后控制台输出的顺序是console.log(1); setTimeout(() { console.log(2); Promise.resolve().then(() console.log(3)); }, 0); Promise.resolve().then(() console.log(4)); console.log(5);这道题的输出是1 5 4 2 3。推导过程是同步代码先执行打印1和5微任务队列清空打印4宏任务队列中取setTimeout回调打印2回调内部的微任务入队并执行打印3。这个模型可以用来解所有事件循环的输出顺序题。做题时建议直接在草稿纸上画出三个队列——同步队列、微任务队列、宏任务队列然后按顺序模拟执行。用这种方式做题即使遇到复杂的嵌套也基本不会出错。4.2 编程题精讲一道二分查找变体题目给定一个升序数组nums和一个目标值target找出target在数组中第一次出现和最后一次出现的下标。如果不存在返回[-1, -1]。要求时间复杂度O(log n)。输入nums [1, 2, 3, 3, 3, 5, 8], target 3 输出[2, 4]这道题是“在排序数组中查找元素的第一个和最后一个位置”的变体LeetCode原题是34题。小米笔试中经常会出现这种“经典题换个包装”的考法。核心思路是用两次二分查找分别找左边界和右边界。function searchRange(nums, target) { const left binarySearchLeft(nums, target); if (left -1) return [-1, -1]; const right binarySearchRight(nums, target); return [left, right]; } function binarySearchLeft(nums, target) { let low 0, high nums.length - 1, ans -1; while (low high) { const mid (low high) 1; if (nums[mid] target) { ans mid; high mid - 1; // 继续向左找 } else if (nums[mid] target) { low mid 1; } else { high mid - 1; } } return ans; }这里注意一个细节二分查找的左右边界不能写成一个通用的findFirst函数然后通过取反来复用因为边界条件和mid的移动方向不同容易出错。笔试时为了稳妥写两个单独的函数虽然代码量多一点但正确率更高。大多数人的bug都出在while循环里条件写错导致死循环或者漏掉边界。我的习惯是在写完之后用一个长度为1的数组和一个长度为2的数组分别做一次边界测试比如[1]和[1, 3]这是最快发现边界bug的方法。4.3 设计题精讲笔试题后的面试加码小米的笔试有时会有一道简答/设计题今年第一批的方向是“设计一个前端错误监控系统要求包括采集、上报、展示三个环节请写出你的技术方案和关键实现思路。”这道题虽然不算分到编程题但面试官通常会根据你的笔试答案在面试环节做深度追问。所以不要只写几个关键词要呈现完整的思考路径。我的回答思路是这样的采集阶段捕获全局JS运行时错误监听window.onerror和window.addEventListener(unhandledrejection)对Promise异常单独捕获因为onerror监听不到rejection对资源加载错误通过监听error事件且判断event.target ! window来区分资源错误和运行时错误。重点说明SourceMap在线上定位源码位置的作用以及为何线上要开启sourcemap的白名单控制避免源码泄露。上报阶段用navigator.sendBeacon在页面卸载时上报因为传统的XMLHttpRequest在unload场景下容易丢失同时通过采样率来控制上报量比如只上报10%的用户错误或者错误多次重复时用指数退避算法来降低频率。展示阶段按错误类型和发生次数做聚合展示按影响用户数排序。这里可以提一下错误堆栈的sourcemap还原方案的思路以及如何用错误指纹做同源错误的聚合。这道题真正的加分项不是方案完整而是你能明确指出某个环节的取舍原因——比如为什么用sendBeacon而不是fetch、为什么错误聚合用指纹而不是直接按message聚合说清楚取舍逻辑就说明你是真的思考过而不是背了一个模板。5. 常见问题与避坑技巧实录5.1 在线笔试环境常见故障与应对每次笔试后都会有一批人因为技术问题成绩受影响我在这里集中整理一下最常见的几种情况。切屏记录或代码编辑器白屏如果出现代码编辑器无法输入或提交按钮无反应第一时间进行页面刷新刷新后系统会自动保存你之前写的代码。但要注意刷新会导致一次不算太严重的切屏记录如果次数不多不会影响成绩。千万别刷新完发现代码丢了就慌牛客的编辑器是有自动保存草稿机制的。如果你没写代码就开始刷新那才真的会丢。无法编译或提交超时通常是测试用例数据量过大导致的但偶尔也是在线编辑器某种限制出现了问题。这时候先检查代码中是否有死循环以及是否使用了超出题目范围的递归深度。如果代码逻辑没问题可以尝试把递归改成迭代再重新提交。摄像头认证失败人脸识别一直无法通过的情况经常出现在光线暗、戴了帽子、或者摄像头像素太低的环境。建议开考前调整好光线摘下帽子和口罩关闭美颜效果有些摄像头软件带美颜会影响识别。如果试了几次都不行不要反复刷新人脸识别页面等待几秒后系统自动跳转即可或者联系在线客服处理。5.2 时间管理和答题策略120分钟的时间我的分配建议是这样的前40分钟做选择题和多选题中间60分钟做编程题最后20分钟做简答题和检查。前40分钟看起来很充裕但实际选择题里有一些框架原理题读题加排除选项可能每题要花3到4分钟。多选题尤其不能恋战如果你的第一判断在30秒内无法确定为某个选项先标记后跳过最后有时间再回来。编程题部分每道题的墙上的时间是25分钟但这25分钟不是给你纠结完美解的。第一题如果15分钟内还卡在边界条件的判断上就切换到暴力解法不要再死磕。第二题如果10分钟没有思路直接放弃把时间挪给简答题和检查。大厂的笔试不是要你满分而是考察你在有限时间内的取舍能力。最后20分钟的简答题不要写大段大段的论述面试官评分时看的是结构而不是字数。用分点关键词的方式回答把方案的骨架列清楚比写一堆流水账分数更高。5.3 从笔试到面试哪些点会被追问笔试结束不代表做题就结束了。小米的面试官会拿到你的笔试成绩和答卷并且会在面试时针对你的答案做追问。这个环节很多人忽略了。比如你在编程题里用了深拷贝面试官可能就会问深拷贝和浅拷贝的区别是什么你的实现能不能处理Symbol属性循环引用怎么解决所以在笔试结束后建议立刻把你做过题的思路和参考解法整理成文字放到自己的备忘录里。面试前重新看一遍不要等面试官问起来的时候才现场回忆。尤其是简答题的方案面试官很喜欢顺着你的方案往下追问。比如你写了用sendBeacon上报错误大概率会被追问sendBeacon和fetch的区别是什么它能不能携带自定义Header这其实是在考察你的简历里写的性能优化和工程化项目有没有真正落实到细节上。另外说说心理层面的经验。我在跟学弟学妹聊天的过程中发现有个很普遍的现象是对笔试成绩过度焦虑总担心笔试挂了就直接简历池沉底。实际上小米的招聘流程中笔试只是综合评估的一环面试表现和过往项目经历的影响权重很大。如果笔试确实没发挥好也不用气馁很多部门在面试时有单独的手撕算法环节你可以在那一环节证明自己。关注点在“下一场怎么准备”而不是反复纠结已经结束的笔试。6. 一些让我觉得特别重要的细节说了这么多最后再分享几个我觉得在备考中特别容易被忽视、但实战中非常关键的点。第一刷题不要只刷“前端面试题”要把经典的数据结构和算法基础捡起来。前端框架更新换代很快但算法的底层逻辑是不变的。今年小米考的树形DP很多人连状态转移方程都写不出来就是因为平时只刷“按钮防抖”“数组去重”这类贴着业务场景的题目缺少对算法本身的理解。笔试中的算法题就是一块试金石刷基础算法题的投入产出比远高于刷各类框架题。第二代码规范在笔试中是隐形加分项。虽然在线评测只关心你是否AC但如果你在笔试中写的代码变量命名清晰、逻辑分层明确面试官在看到你的答题记录时会留下更好的印象。尤其是简答题的代码片段字迹工整的代码和随便写一气的代码给人的专业度差异非常大。第三笔试完了别急着关电脑。多花5分钟检查一遍所有题目是否都已保存、是否都已提交。每年都有不少人因为漏提交或者提交了一道空代码而白白丢分。牛客系统的提交状态会在题目列表上显示绿色对勾才是已经提交成功。考试结束前记得再全选一遍所有题目确认没有遗漏。第四也是最核心的注意审题。很多人在笔试中丢掉的最冤枉的分不是不会做而是没看清题目要求。比如题目要求输出[-1, -1]有人输出[ -1, -1 ]题目要求对0做特殊判断有人忘了边界值为0的情况。读题的时候把题干里的每一个数字都当成考点把输入范围和边界条件先写一遍再动笔写代码。这个习惯能帮你在所有笔试中至少多拿10分。我带着学弟学妹复盘完今年这批笔试后最大的感受是小米前端笔试的风格和它对候选人的预期是一致的——既要你基础扎实又要你工程落地能力强还要你有不错的算法思维。如果你正在准备下一批笔试我的建议很简单刷题以LeetCode中等题为主适当刷一些困难题训练思维八股文按模块系统过一遍不要只背面试题准备一两个真正自己写的项目把项目的技术细节挖透。做到这三点你面对任何一场大厂前端笔试都会从容很多。这条路确实不容易但走过去了就能看到下一站的风景。
返回列表