尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

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

猿辅导2020校招笔试(一)全复盘:题型解析与备考指南

猿辅导2020校招笔试(一)全复盘:题型解析与备考指南 1. 这场线上笔试到底考什么题型构成与岗位差异2020年那个秋招季我投了猿辅导的后端研发岗位。收到笔试通知的时候心里其实有点没底毕竟那是我第一次参加完全线上的技术笔试。整个笔试一是在牛客网系统上完成的全程开着摄像头电脑屏幕实时监控桌面只允许放草稿纸和笔。90分钟20道选择题加3道编程题在宿舍里一边敲代码一边手心冒汗那种体验比线下考场还紧张因为系统每三分钟会自动抓拍一次你根本不敢低头看手机。整场笔试做下来最大的感受是这份卷子不是在单纯堆难度而是在用一种很清晰的方式告诉你他们需要什么样的工程师。选择题覆盖了计算机网络、操作系统、数据结构、数据库这些计算机基础编程题则从字符串处理、动态规划、图的遍历这几个大方向出题。不是那种偏题怪题而是你刷LeetCode和剑指offer时大概率见过的经典模型。笔试结束后我在几个校招群里和同学对了一下题发现不同岗位的卷子差异还挺大下面把题型和准备思路拆开讲。1.1 笔试的整体框架时长、题量与平台先交代一下当时的客观环境。猿辅导的校招笔试一走的是线上笔试平台牛客网为主。研发岗一般是90分钟个别岗位可能出现120分钟的情况具体以邮件通知为准。题型分为两部分选择题和编程题选择题一般在20道上下编程题通常3道难度排列是从易到难。选择题是客观题覆盖范围很广包括但不限于数据结构与算法基础栈、队列、二叉树遍历、排序复杂度、哈希冲突。操作系统进程与线程、死锁条件、页面置换算法。计算机网络TCP三次握手、HTTP状态码、TCP拥塞控制。数据库事务的ACID特性、索引、常用SQL语法。逻辑推理题类似行测的数列、图形推理偶尔会混一两道。编程题则是标准ACM赛制的在线评测支持C、Java、Python、Go等多种语言。系统会自动判题有错误信息提示但不会告诉你正确答案。这里有个非常重要的细节平台是严格区分“本地IDE做题”和“线上提交”的你本地跑通不算通过必须以线上输出为准。1.2 研发岗与非研发岗的卷子差异同一个笔试一标题下不同岗位拿到的卷子其实是分开的。后端、前端、客户端、算法、数据分析每个岗位都有自己的出题侧重点。我投的是后端岗卷子里的编程题偏算法和数据结构选择题重点在网络、操作系统、数据库这些后端核心基础。前端岗的同学反馈他们的选择题里有不少HTML/CSS/JavaScript相关的内容编程题也会涉及DOM操作或异步逻辑的模拟。算法岗的笔试题更离谱一些除了常规算法题还加了概率统计、机器学习基础的概念选择题时间也更紧张。数据分析岗则出现了SQL查询和概率统计计算题。所以准备笔试前第一件事不是盲目刷题而是搞清楚自己投的岗位笔试到底偏向哪些领域。你让一个准备后端的人去狂刷机器学习方向就完全反了。1.3 笔试设计背后的筛选逻辑为什么猿辅导这种做在线教育的公司校招笔试第一关要考这些呢我后来跟一位在猿辅导工作的学长聊过他的说法让我印象深刻笔试不是要刁难你而是要高效筛选出“有工程落地能力”的候选人。猿辅导的业务涉及直播课、题库、拍照搜题、AI互动课等方向后端要处理大量高并发请求、音视频传输、数据存储算法团队要做题目推荐、学生画像、拍照识别。这些场景背后的底层能力其实就是算法和数据结构基础。一个候选人即使简历写得再漂亮代码题一做基本功扎不扎实立刻暴露。这也是为什么笔试放在简历筛选之后、面试之前——它是一道成本很低但信号价值很高的门槛。聊到这里你可能会问那选择题考那些琐碎的基础知识有什么用我的理解是基础知识决定了一个工程师的上限。线上课堂偶尔出现一个诡异Bug可能就藏在TCP重传机制或者数据库索引失效里系统高并发时服务抖动往往就是进程线程模型没吃透。笔试把基础题放在前面其实是在提醒你别只刷题书也要看。2. 选择题部分看似送分实则拉分的计算机基础很多人准备校招笔试把大部分精力都放在编程题上觉得选择题随便做做就行。我第一次模拟笔试也是这个心态结果被教做人了。猿辅导笔试一的选择题单题分值不高但偏偏有些题是“少数服从多数”的坑你会觉得A很对可正确答案是B而且它有“陷阱选项”专门等着你跳。下面我按自己踩过的坑把选择题的高频考点和错题复盘方式写出来。2.1 高频考点分布数据结构、操作系统、网络、数据库从笔试一的题目分布来看选择题大概可以分成四块数据结构约25%二叉树的先序/中序/后序推导、栈和队列的特性、哈希碰撞的解决方法、快排和堆排序的时间复杂度对比。操作系统约25%进程和线程区别、死锁产生的四个必要条件、虚拟内存分页、进程调度算法。计算机网络约25%TCP和UDP的区别、TCP三次握手四次挥手、HTTP状态码含义、DNS解析过程。数据库约15%事务ACID、索引失效场景、SQL子查询与连接。其余10%逻辑推理、数学概率。这个比例是我个人对那场笔试的回忆不同批次可能有浮动但大方向基本一致。计算机基础这四门课是校招笔试永远绕不开的“基本盘”。2.2 两道容易错的经典题复盘选择题里有两类题我印象特别深也是同学群里讨论最热烈的。第一类是关于栈和队列的时间复杂度。题目大概是用两个栈实现一个队列入队和出队的平均时间复杂度分别是多少很多人看到“两个栈”就直接选了O(1)但实际上入队是O(1)出队最坏是O(n)但均摊下来是O(1)因为每个元素只会从输入栈搬到输出栈一次。如果题目问的是“最坏时间复杂度”答案就是O(n)。一字之差答案完全不同。第二类是TCP拥塞控制的题目。题目给出一个网络状态变化图问慢启动阶段发生了什么。很多人容易把“拥塞避免”和“慢启动”搞混实际上慢启动是拥塞窗口从1开始指数增长到达慢启动门限后进入拥塞避免转为线性增长。这种题没有任何技巧只能把TCP状态机的几个关键阶段背熟然后配合题目里的数字推算一遍。这两道题给我的启发是选择题的难点不在于知识点偏而在于你以为你会了其实你只是“眼熟”。复习的时候不能光看标题过一遍而是要把每个知识点都关上书默写一遍A4纸写不出来就是没掌握。2.3 答题节奏与心态管理选择题20道建议用时控制在35分钟以内给自己留出55分钟解决3道编程题。我当时的策略是遇到一眼能确定答案的题直接选完走人遇到拿不准的题先在草稿纸上标记题号但不要长时间死磕因为编程题的性价比更高。这里特别提醒一个细节牛客网的笔试系统有些场次允许你“回顾上一题”有些场次不允许。开考前先花30秒熟悉一下答题界面弄清楚能不能返回修改答案。如果不能返回那就要在答题时更加谨慎宁愿多花20秒验算也不要回头找补机会。我当时比较幸运系统可以回看所以把不会的选择题跳过最后用剩余时间回头猜了几道至少没有空题。另外选择题里如果出现多选题目旁边一般会注明“多选”字样。有些同学没注意按单选来做白白丢分。别笑每年都有这种人。3. 编程题复盘三道题背后的通用套路编程题是整场笔试的大头也是区分度最高的部分。猿辅导笔试一的3道编程题从难度上看是递进的第一道偏字符串和模拟第二道是动态规划第三道涉及树或图的遍历。题型看似固定但每年都会换外壳核心模型就那么几个。我在下面把每类题的通用解法和应对思路写出来并且附上代码。注意题目永远会有新马甲但你只要把底层的状态定义、遍历逻辑、边界条件吃透换什么外壳都不怕。3.1 第一道字符串处理与滑动窗口第一道题通常是个“开胃菜”但开胃菜也会咬人。常见模型包括最长无重复字符子串、字符串压缩、版本号比较、括号匹配。虽然第一道题难度不高但如果细节处理不好照样会卡很久。以最长无重复字符子串为例经典的解法是滑动窗口时间复杂度O(n)空间复杂度O(n)。def length_of_longest_substring(s: str) - int: left 0 max_len 0 seen {} for right, ch in enumerate(s): if ch in seen and seen[ch] left: left seen[ch] 1 seen[ch] right max_len max(max_len, right - left 1) return max_len这道题的关键不是背代码而是理解滑动窗口的思想右指针不断向右扩展窗口一旦发现窗口内有重复字符就移动左指针跳过重复字符同时更新最大长度。笔试中我见过它的变形把一个字符串后拼接自己再求最长无重复子串也见过升级版“最多包含K个不同字符的最长子串”。核心还是窗口扩展和收缩的条件。如果第一道题是括号匹配这类栈应用思路也是固定的遇到左括号入栈遇到右括号出栈并检查是否匹配。这类题只要把栈的“后进先出”特性想明白基本不会出错。3.2 第二道动态规划的状态设计第二道题大概率是动态规划。校招笔试里的DP题很少有人能第一次做对因为它不像遍历和模拟那么直观需要你抽象出状态定义和转移方程。我在笔试里遇到的是最长上升子序列的变种当时一上来就写两层循环结果是O(n^2)勉强能过但如果数据量到10^5就必须上贪心加二分的O(nlogn)优化。先看经典的O(n^2)解法def length_of_lis(nums): if not nums: return 0 dp [1] * len(nums) for i in range(len(nums)): for j in range(i): if nums[j] nums[i]: dp[i] max(dp[i], dp[j] 1) return max(dp)dp[i]表示以nums[i]结尾的最长上升子序列长度。转移逻辑是遍历i之前的所有元素j只要nums[j]小于nums[i]就可以把nums[i]接到以nums[j]结尾的序列后面长度加1。这个状态定义非常经典笔试中的编辑距离、最小路径和、打家劫舍、零钱兑换全都是同一个套路——先定义“以i结尾/前i个”的DP数组再写转移方程最后处理初始化和边界。动态规划题拿高分的技巧是不要急着写代码先在草稿纸上写出状态定义、转移方程、初始条件和最终答案四个部分全部理顺后再翻译成代码。这个过程看着浪费时间实际上能省下大量调试时间。3.3 第三道树或图的遍历第三道题通常是压轴常见模型有二叉树层序遍历、二叉树最近公共祖先、岛屿数量图的DFS、拓扑排序。这一类题考察的是对递归和队列的掌握程度。以层序遍历为例经典解法是BFS借助队列逐层访问def level_order(root): if not root: return [] res [] queue [root] while queue: level [] size len(queue) for _ in range(size): node queue.pop(0) level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(level) return res这里有一个小心机每层遍历前先记录queue的长度size这一层只处理前size个节点这样就能保证输出是分层的。如果忘了记录size直接while queue最后输出的就只有一个半层不分的序列。图遍历的题比如岛屿数量核心是DFS遇到陆地就把整个岛屿“淹没”再继续扫描下一个格子。def num_islands(grid): if not grid: return 0 m, n len(grid), len(grid[0]) count 0 def dfs(i, j): if i 0 or i m or j 0 or j n or grid[i][j] 0: return grid[i][j] 0 dfs(i-1, j) dfs(i1, j) dfs(i, j-1) dfs(i, j1) for i in range(m): for j in range(n): if grid[i][j] 1: count 1 dfs(i, j) return count树的递归遍历最容易出的坑是忘记边界条件。递归函数一进入第一件事永远是判空否则就会报RecursionError或者访问None节点的属性。笔试环境里报错信息有限递归边界没写好你可能会花十分钟去查一个低级错误。4. 牛客网笔试系统环境、输入输出与提交的十个坑说完了题型必须来聊聊工具。很多同学LeetCode刷得飞起一上牛客网笔试就翻车核心原因是没有适应在线评测系统的“脾气”。猿辅导用的牛客网系统和LeetCode有本质区别LeetCode只需要你补充核心函数牛客网需要你自己处理完整的输入输出。我整理了笔试中一定会遇到的坑提前看到至少能少踩一半。4.1 本地能跑、OJ却说答案错误常见原因最崩溃的体验是本地IDE测试所有的用例都通过了提交到OJ上却提示“答案错误”或“运行超时”。原因不外乎这几个输入格式理解错了。题目说“第一行是T表示用例组数”你却没写循环处理多组测试用例只处理了第一组。输出多了多余字符。OJ的判题是严格匹配的多打一个空格、少打一个回车都可能判错。数组越界。本地Python会报IndexError但有些题目数据量一大数组越界导致内存错误显示“段错误”。递归深度超限。Python默认递归深度是1000如果图遍历用递归图一深就爆建议改成迭代或者提高递归深度sys.setrecursionlimit(1000000)。我在第三道图的题上就吃过亏DFS递归写得太开心结果数据一大直接超时。后来改成迭代栈写法才在时间限制内通过。4.2 输入输出格式的细节牛客网的输入输出和你在OJ上刷题时的规范完全一致。笔试前一定要把这几个模板记熟读取整行按空格拆成整数列表import sys line sys.stdin.readline().strip() nums list(map(int, line.split()))不确定一行有多少个数字时用全部读取的方式import sys data sys.stdin.read().strip().split()需要注意strip()会把字符串首尾的换行和空格去掉防止拆出空字符串。而split()默认按空白字符切分包括空格、制表符、换行连续空白也会被忽略所以大多数情况下直接split()就够了。输出格式上通常要求每个结果占一行。如果你用print()默认会加换行这点没问题。但问题出在列表输出上如果题目要求输出一个列表格式可能是“1 2 3”而不是“[1, 2, 3]”。很多人直接在本地print一个list提交上去发现格式错就是这个原因。4.3 提交策略暴力拿分、调试与构造边界用例笔试时间有限编程题不是每题都要拿满分。我的策略是先花5分钟通读三道题如果第三题完全没思路就果断放弃把时间留给前两题的优化。遇到不会做的题先写一个暴力解法哪怕复杂度O(n^2)甚至O(n^3)能过部分用例就是赚到。牛客网的判题机制通常是按通过用例比例给分暴力过60%和空着交0分差别非常大。提交前一定要自己构造边界用例测试空数组、单元素、全是重复元素、最大数值、负值。这些边界用例往往是系统压测的重点。调试输出不要直接print在结果里。很多平台会把你的所有输出当成答案提交多打一行调试信息整题判错。我习惯的做法是在本地调试时用print提交前把调试代码全部注释掉或者用if False: print(...)包起来。还有一个细节代码里如果存在while True循环且没有正确退出条件OJ会判定“运行超时”。我见过同学在读取多行输入时写while True: line sys.stdin.readline()结果平台读不到结束符卡死整个程序。后续不管怎么改都超时最后才发现是死循环。正确的多行读取方式要么用sys.stdin.read()一次性读入要么判断line是否为空再跳出循环。5. 为猿辅导笔试做的备考规划时间线与刷题重点笔试不是靠考前突击三天就能过的。我自己的备考周期是六周从8月初开始到9月中旬参加笔试期间每天都在固定刷题、总结。这里整理一下我觉得最有效的时间线以及不同阶段的复习重点。5.1 我的备考时间线从剑指offer到LeetCode Hot 100第一周到第二周剑指offer过一遍。这本书里的题思路比较经典难度适中特别适合从LeetCode转过来的同学建立信心。我当时按照链表、二叉树、栈与队列、动态规划、字符串、数组这样的顺序把每题都手写一遍不借助IDE自动补全因为笔试环境就只有最原始的高亮编辑器自动补全几乎没有。第三周到第四周LeetCode Hot 100分类刷。这个阶段要开始练“看题就能定位类型”的敏感度。拿到题先问自己这题是滑动窗口还是双指针是DFS还是BFS是背包DP还是区间DP如果前三分钟无法判断题型说明刷题量还不够需要继续做专项训练。第五周牛客网真题模拟。这一步非常关键。牛客网有专门的校招真题板块猿辅导往年的笔试题以及其他大厂的笔试题都可以拿来模拟。限时90分钟全程开着摄像头用纸笔做草稿完全复制笔试环境。我第一次模拟只做对了1.5道编程题节奏完全失控。但练了三次之后手感明显提升至少不会在选择题上浪费太多时间了。第六周查漏补缺和错题回顾。翻出前五周的错题本把重复出错的知识点重新刷一遍。比如我总是在边界条件上出错这周就集中刷了“数组越界、空指针、单元素输入”相关的题目效果很明显。5.2 刷题优先级和资源推荐如果你时间有限刷题优先级可以这样排数组与哈希 字符串 链表 二叉树 动态规划 图与搜索 其余。这个排序不是绝对的但适用于绝大多数互联网公司后端岗位的笔试。数组、哈希、字符串是出题频率最高的二叉树和DP是拉开分差的点图与搜索虽然考得少但一旦考就是压轴题。资源方面我推荐三个渠道LeetCode中文站题库全讨论区有各路大神题解适合按算法标签分类刷。剑指offer原书或配套在线题库每道题都有详细思路讲解适合打基础。牛客网历年真题最接近真实笔试环境也最贴近目标公司的出题风格。很多人问我要不要把所有题解都背下来我的回答是千万不要背题要背“思路框架”。你背下一个动态规划模板换个题目就废了但如果你理解“dp[i]怎么定义、转移方程怎么推”同类题都能解。5.3 结合教育业务的加分准备作为一家在线教育公司猿辅导的笔试有时会带上一点点业务色彩。比如编程题里可能出现“课程表”“作业调度”“学习路线”这类场景选择题里也可能出现“网课系统响应慢应该怎么排查”的分析题。这些题本质上还是在考察算法和系统设计基础只是披了一层教育业务的壳。我的建议是准备笔试的同时稍微了解一下在线教育行业的核心技术方向包括但不限于直播连麦、课件分发、题库系统、个性化推荐。不需要精通但至少在选择题里遇到“实时互动课堂的延迟要求大概是多少”这类问题时心里有数。这类知识不需要专门买课看几篇技术博客就够了重点是展示你对这家公司业务的技术思考。6. 笔试后的流程衔接与复盘方法笔试结束那一刻千万不要觉得万事大吉。说实话我见过很多人笔试考完就放飞自我结果收到面试邀请时连自己当时写了什么都想不起来。笔试后的复盘和跟进对后面的流程同样重要。6.1 笔试结束后的第一件事记录与复盘我在交卷后的10分钟内趁记忆还新鲜把三道编程题的题干、自己的思路、卡住的位置、最终提交的代码框架全部记在云笔记里。为什么这么做原因有两个第一如果笔试没通过这份记录是你查漏补缺的最佳素材第二如果笔试通过了面试官在面试时可能会参考你的笔试表现甚至直接问你“你当时编程题第二题是怎么想的”。这点我后来在面试中真的遇到了。面试官问我笔试某道动态规划题我因为当时有记录能清晰地讲出状态定义、转移方程和踩过的坑面试官明显对这样的回答更有好感。所以笔试题解文档不只是写给“笔试前”的自己看更是写给“面试中”的自己看。复盘的具体方法是对照题解把每道错题重新写一遍直到不看任何参考资料能AC为止。不要只改答案要写一段“破题思路”包括我怎么判断出这题是DP/滑动窗口/DFS的我的解法时间复杂度是多少还有没有更优解这个思考过程才是复盘的精华。6.2 成绩查询与面试邀约节奏猿辅导的笔试结果一般会在1到2周内通过邮件或短信通知具体时间以HR的实际节奏为准。如果你投的是内推批次有时会走免笔试通道直接进入面试但笔试一的成绩依然是后续面试流程的重要参考。等待期间我建议不要干等而是立刻启动下一轮备战。因为笔试通过后面试通知通常来得很快预留的准备时间往往只有三五天。你如果从收到面试通知才开始复习大概率只能临时抱佛脚效果堪忧。正确的做法是把“准备面试”当作笔试结束后的下一阶段任务提前开始整理项目、复习八股、手写算法。6.3 从笔试到面试的衔接准备关于面试内容我在这里只做一个简单衔接详细的面经后面再单独写。笔试侧重算法和基础知识面试则会更看重三个方面项目经历你做了什么、为什么这么做、遇到什么问题、怎么解决。计算机基础追问笔试里考选择题的知识点面试里会变成口头问答比如“TCP三次握手为什么不是两次”“InnoDB索引为什么用B树”。手写代码难度通常比笔试低一点但要求边写边讲思路。从笔试到面试本质上只是从“笔试系统判分”切换成“面试官当面判分”考察的内核是一样的你的基础是否扎实、逻辑是否清晰、代码是否可靠。把这三点想明白整个校招笔试面试的链路就顺了。最后再分享一点个人体会。我现在回头看猿辅导2020校招笔试一其实题目本身并不算难真正难的是在有限时间内保持冷静把会做的题都做对、把不会做的题拿到尽可能多的部分分。笔试不是选拔天才它更像一场压力测试考的是你在陌生环境、时间压力、不完整反馈的情况下还能不能条理清晰地解决问题。这种能力恰恰是后续工作中每天都在用的。后面笔试二和其他校招流程的内容我也会接着整理希望这篇笔经能帮你少走一点弯路。
返回列表