校招技术岗在线笔试全解析:从算法题到考场策略
每年秋招技术岗的第一道关卡基本都是在线笔试。最近好几个学弟学妹在后台问我猿辅导2023校园招聘技术岗笔试二的事主要集中在三个问题第二批会不会更难编程题占比多少有没有办法突击作为一个参加过多家互联网公司校招笔试、也带人做过不少模拟笔试的过来人我直接把这套卷子的结构、高频考点和考场策略完整拆一遍。这篇不是押题重点也不是找原题而是帮你建立一套应对校招技术笔试的思考框架把能拿的分都拿到。1. 从“笔试二”看在线技术笔试的结构与判分逻辑1.1 为什么叫“笔试二”而不是“一套卷子”很多同学看到标题里的“二”会下意识觉得这是第二套题甚至脑补出“第二批会不会更难”之类的规律。实际上当一场招聘的投递量很大的时候系统很难在一次笔试里完成所有候选人的考核所以会分多个批次进行。“二”就是第二批仅此而已。更有参考价值的信息是第二批和第一批通常共用一个题库但每套题目是动态组卷或者从题库里随机抽取所以不同批次之间不存在稳定的难度差异。你唯一能确定的规律就是基础知识点一定会覆盖算法题一定占大头选择题一定不会少。与其花时间猜批次难度不如把底子打牢。1.2 典型技术笔试的题量分配以猿辅导这类在线教育公司的技术岗笔试为例一场笔试的常见形态是选择题加编程题混合总时长90到120分钟。这里我把比较典型的题量列一下选择题/多选题10到20道覆盖数据结构、操作系统、计算机网络、数据库、语言基础等。编程题3到4道从签到题到压轴题都会有通常至少包含一道明确送分的easy题。部分场次会出现一道简答/场景设计题需要用文字描述方案。这种结构最难受的地方在于选择题看起来不难但会占用大量时间编程题如果第一道就卡住后面的节奏会全乱。所以开考后的前3分钟先做全局浏览比蒙头做第一题更重要。你先看清楚哪些题简单、哪些题需要攻再决定动笔顺序。1.3 判分逻辑决定了你的答题策略很多同学对在线笔试的判分方式只有一个模糊的概念题目过了就过没过就没过。实际情况要复杂一些而且直接关系到你怎么分配时间。校招笔试的编程题几乎都是按测试用例分组给分的。也就是说一份代码跑过多少组用例就能拿到对应的分数并不是“0和1”的关系。就算你只过了一个最简单的样例也经常能拿到保底分。所以“写不完”和“不写”是完全两码事。另外很多平台会记录你的作答轨迹包括编译失败次数、提交次数、总耗时等。这些东西不一定直接参与评分但如果你的成绩进入了面试环节面试官查看代码提交记录时可能看到这些过程。反复提交同样一份代码或者留一堆编译失败的记录会给面试官留下不太好的印象。更合理的做法是在本地IDE里多构造几组测试数据跑通了再提交。注意注释不是越少越好。在代码里写清楚思路和复杂度分析尤其是当你已经没时间写完整代码时把核心思路用注释表达出来人工阅卷时依然有参考价值。2. 算法题复盘当看到题目时第一秒该想什么2.1 约束条件就是最明显的提示我经常和同学说笔试里的算法题数据范围本身就是提示。出题人不会闲着没事随便写一个 n 的取值范围这个值直接决定了你该用什么复杂度的算法。数据范围算法方向n ≤ 20状态压缩DP、DFS/暴力搜索 剪枝n ≤ 1000O(n^2) 的DP、Floyd、暴力枚举n ≤ 10^5O(n log n) 的二分、排序、堆、树状数组/线段树n ≤ 10^9数学推导、矩阵快速幂、公式法举个例子如果题目里写 n ≤ 10^5你就不应该想着写两层for循环。一个训练有素的选手看到这个数据范围脑子里会立刻弹出二分、双指针、滑动窗口、排序后扫描、堆优化等方向。这不是玄学而是长期刷题形成的条件反射。2.2 三道接近笔试风格的算法题拆解我先声明一下下面三道题不是通过非正常渠道拿到的所谓真题而是按照猿辅导这类公司近年校招常考的知识点复刻出来的同类型题。你在笔试里碰到的不一定是原题但解题思路可以平移。第一题滑动窗口求最短子数组给定一个正整数数组 arr 和一个正整数 target找出数组中和大于等于 target 的最短连续子数组长度不存在则返回0。破题过程看到“连续子数组”和“正整数”两个条件第一时间就该想到滑动窗口。维护左右两个指针右指针负责扩展窗口当窗口内的和满足条件时更新答案并收缩左指针。代码很简洁def min_subarray_len(target, nums): left 0 cur_sum 0 ans float(inf) for right in range(len(nums)): cur_sum nums[right] while cur_sum target: ans min(ans, right - left 1) cur_sum - nums[left] left 1 return 0 if ans float(inf) else ans这里要注意一个关键点滑动窗口能成立的前提是数组元素为正整数。如果数组里有负数窗口的收缩逻辑就会失效因为加入负数可能让窗口和变小这个题就不能用滑动窗口了得换前缀和加二分的思路。题目里“正整数”三个字就是决定解法走向的核心条件。第二题课程表给定 n 门课程编号从0到n-1以及一系列先修关系判断是否可以完成所有课程。这个题本质上是在检测有向图里有没有环。我的建议是笔试中优先用拓扑排序也就是BFS思路因为代码结构清楚不容易写错。先构建邻接表和入度数组把所有入度为0的节点入队逐个弹出并减少邻居的入度。最后统计弹出的节点数如果等于总课程数说明没有环可以完成全部课程。拓扑排序的模板要背熟因为在笔试题里它经常会以各种包装出现比如任务调度、编译依赖、课程安排等。高频模板值得反复默写。第三题最长递增子序列给定一个整数数组求最长严格递增子序列的长度。这是一个老牌动态规划题。最朴素的状态转移是 dp[i] max(dp[j] 1)其中 j i 且 nums[j] nums[i]时间复杂度 O(n^2)。如果 n ≤ 1000这个解法完全够用。但如果 n ≤ 10^5就必须用贪心加二分的优化思路。优化思路是维护一个数组 tails其中 tails[i] 表示长度为 i1 的递增子序列的最小结尾元素。遍历数组时通过二分查找找到第一个大于等于当前元素的位置然后更新它。这样做的核心逻辑是相同长度的递增子序列结尾元素越小后面接新元素的机会越大。这种“贪心预留可能性”的思路在笔试中经常用到。2.3 只会暴力解时怎么把损失降到最低不是每道题都能在考场上想出最优解这很正常。关键在于当你只有暴力思路时也要动手写。技术岗笔试不是竞赛它给出的是部分分制度。一组一组测试用例地过暴力解在小数据范围下是可以拿到相当一部分分的。正确的做法是先把暴力版本写出来确保逻辑正确然后跑一遍样例再在注释里写上“当前复杂度O(n^2)可通过二分优化到O(n log n)”这类说明。这样即使没有优化判卷系统已经给了你对应的部分分面试官也能看到你有优化意识。记住空白卷一定没分超时还可以拿部分分。笔试时最忌讳的不是解法不够优雅而是明明有思路却因为不够完美而不肯下笔。3. 选择题与场景设计题真正的隐性分水岭3.1 基础选择题高频考点速查很多同学把宝全押在算法题上结果发现选择题错一错分数就掉了一大截。选择题错5道相当于算法题少做出一道中档题这在总分排名里是很明显的差距。结合近几年校招笔试的情况我整理了一张高频考点表每个点后面附了一个容易踩的坑。考点常见坑TCP三次握手第二次握手能否携带数据能但只有第三次握手后客户端才能正式发送数据HTTP状态码301是永久重定向302是临时重定向304是未修改注意缓存场景进程与线程进程是资源分配单位线程是CPU调度单位线程共享进程的地址空间死锁四个必要条件互斥、请求与保持、不可剥夺、循环等待。破坏任意一个都可以预防死锁数据库索引B树适合范围查询最左前缀原则决定联合索引的命中情况事务隔离级别读未提交会产生脏读读已提交解决脏读但可能幻读可重复读解决不可重复读串行化解决所有但性能差这些内容看起来很简单但临场最容易翻车。比如TCP三次握手很多人只知道三次握手的流程却不清楚第二次握手时服务器能不能携带应用层数据为什么第三次握手还要占用一个报文段。出题人特别爱拿这种“你背诵过但没真正理解”的地方出题。3.2 一道在线教育业务场景题的作答框架猿辅导的业务以在线教育为主所以场景设计题有可能会往这个方向靠。比如设计一个错题本系统、设计一个直播课举手发言的消息系统、或者设计一个作业批改的任务队列。这类题没有标准答案但有一个通用作答框架。我以“错题本系统”为例演示一遍。第一步需求分析。用户能添加错题、删除错题、按科目或知识点筛选、记录正确率、生成复习计划。先想清楚核心需求是什么再谈方案设计。如果你把需求分析成“这是A一个简单的增删改查系统”然后就开始写表结构那会让面试官觉得你没有产品思维。第二步数据建模。大致可以设计三张表用户表存用户基础信息题目表存题目内容、科目、知识点错题记录表存用户ID、题目ID、错误答案、正确答案、创建时间、掌握状态。这个模型已经能够满足大多数业务场景。第三步核心接口。需要支持创建错题、分页查询、按科目/知识点筛选、标记已掌握。接口设计时要考虑返回结果的分页结构以及按时间排序等常规需求。第四步扩展性。如果用户量大可以对题目表做缓存错题记录表可以按用户ID进行分表热门题目的访问可以用 Redis 缓存。还要考虑重复添加错题时的幂等性以及删除题目后的历史数据如何处理。这套框架用任何业务题里都能撑住场面。重点不是让面试官觉得你写了一个完整的系统而是让他看到你具备“需求-数据-接口-扩展”的思维路径。3.3 场景题/简答题的时间控制场景题最怕写太嗨。有些同学写设计题能写1000字结果编程题只剩20分钟这属于捡了芝麻丢了西瓜。在线笔试的场景题通常分数占比不高不要为了追求完美而牺牲后面的代码时间。我的一般策略是花不超过10分钟用提纲式结构回答把需求、数据模型、核心流程、扩展点写清楚然后就跳过去写编程题。笔试题是综合平衡的结果不是某一题的个人秀。4. 考场上翻车最多的4个细节以及怎么止损4.1 样例能过不等于能AC边界条件和隐藏条件在线笔试最容易让人放松警惕的时刻就是样例通过的那一刻。很多样例长得太友好暗示性太强导致你没有深入思考边界条件。我举个很典型的例子一道题要求你处理一个整数数组你看到样例里是一个正常排序的数组就直接写了常规解法。但题目的数据范围里写的是“元素值可以为负”或者“数组长度可能为0”这些一旦被测试用例覆盖你的代码就会挂在你不曾考虑过的地方。所以每道题写完后至少花2分钟构造几组边界用例空数组、空字符串只有一个元素的数组全部元素相同数组已经有序或完全逆序n取到题目允许的最大值。这些用例的代码执行结果往往比样例更能反映你写的代码是否正确。4.2 ACM模式的输入输出到底怎么处理校招笔试和力扣日常练习最大的区别之一就是很多平台采用ACM模式需要自己处理标准输入输出。很多同学在学校时练的是核心代码模式到笔试平台读入数据就发懵。举个例子。输入第一行是一个整数n第二行是n个空格分隔的整数。Python的读法通常是import sys def solve(): data sys.stdin.read().strip().split() if not data: return n int(data[0]) nums list(map(int, data[1:1n])) # 处理逻辑 ...这里要注意不要假设所有输入都只有两行。如果题目说的是“多组测试数据”你很可能需要循环读取到EOF。读入字符串时还要小心如果一行里既有空格又有逗号你需要根据题目规则决定分隔符。输出格式也需要认真看。有些题要求“每个结果占一行”有些要求“结果之间用空格隔开”还有些对行尾空格或换行非常敏感。错误会比方法错误更容易丢分因为大部分测试用例可能都死在这一步。4.3 现场时间轴先做哪道题卡住怎么办这里给一个可以复制的比赛时间分配方案当然需要根据你自己的节奏调整第0分钟到第3分钟浏览全部题目标记出easy题和难题先不着急写代码。第3分钟到第18分钟完成第一道easy题写完立刻跑一遍样例和自测用例。第18分钟到第50分钟主攻第二道和第三道medium题。每道题最多花15到20分钟如果没思路就跳过。第50分钟到第75分钟回头处理选择题或继续攻难题。第75分钟到第90分钟不再写新题统一检查边界条件、输出格式、头文件、编译问题。这个方案的核心理念是“先保证基础分再追求高分”。我知道很多同学有一股执念遇到难题非要死磕到底结果最后连签到题都没提交成功。这是笔试的大忌。卡壳超过15分钟一定要果断放手去做下一题。4.4 最后20分钟的高性价比操作到了最后阶段不要追求“再优化一道题”而是要做高确定性的操作。先把所有写了代码的题检查一遍确认没有编译错误。然后按题目顺序重新读一遍题面看有没有看漏条件再检查输出格式看是不是多打了空格或者漏了换行。如果哪道题只想到了暴力解就先提交暴力版本至少拿部分分。最后如果还有时间在代码文件里补充思路注释。这不是为了给机器看而是如果这份代码被人工阅卷面试官能看到你在有限时间内的思考过程。哪怕代码没有通过所有用例思路清晰也能挽回一点分数。给一个我自己的经验最后20分钟里真正能提高分数的动作往往不是“多写一道题”而是“避免低级失分”。格式错误、输出多空格、变量名拼写错误这些才是校招笔试的隐形杀手。5. 备战清单一周内把状态调到最优5.1 刷题优先级与每日安排如果距离笔试还有一周不要再机械地每天刷30道题那没有意义。你需要的是分类训练加上模拟实战。我的建议是每天集中刷1到2个标签比如今天只做“滑动窗口双指针”明天只做“二叉树递归”后天只做“拓扑排序并查集”。每个标签至少写5道题并且在提交之前先自己说一遍思路。能把自己的思路讲清楚才算真正掌握。刷题优先级上数组、字符串、链表、二叉树、动态规划这五块出现频率最高优先保证。图论和贪心可以适当往后放但如果时间允许拓扑排序和并查集是性价比很高的两个模板值得单独花一天练熟。5.2 考前必须能默写的算法模板笔试现场时间紧张如果每个模板都要现场推导会很被动。所以考前请做到“看到题目特征直接默写对应模板”的程度。必背模板清单包括二分查找包括查找左边界、右边界并查集拓扑排序二叉树的前/中/后序遍历递归和迭代链表反转、合并有序链表快速排序或归并排序单调栈通用的DP状态转移框架这里贴一个高频使用的并查集模板因为这个结构简单又常用在很多连通性题目里是核心。class DSU: def __init__(self, n): self.parent list(range(n)) self.rank [0] * n def find(self, x): if self.parent[x] ! x: self.parent[x] self.find(self.parent[x]) return self.parent[x] def union(self, x, y): rx, ry self.find(x), self.find(y) if rx ry: return False if self.rank[rx] self.rank[ry]: rx, ry ry, rx self.parent[ry] rx if self.rank[rx] self.rank[ry]: self.rank[rx] 1 return True笔试前30分钟可以快速默写一遍这个代码或者默写二分模板帮自己进入状态。5.3 考试当天的设备与心态最后说点实操上的细节。校招笔试通常是线上进行考前一天务必确认摄像头、麦克风、网络状态。如果宿舍网络不稳定提前准备好手机热点。考试前把微信、邮件等所有可能弹窗的软件关掉用笔记本的话记得插上电源。还有一点容易被忽略提前确认考试平台和浏览器兼容性。有些平台对浏览器版本有要求临时换浏览器会耽误好几分钟。心态上不要把笔试看得太重。大多数公司的技术岗笔试都是综合性考量不是一场定生死。能做到“把会做的题做对不会做的题拿部分分”你的结果就不会差。最后说点个人体会。我见过不少刷题量很大、代码能力也不差的同学最后倒在校招笔试上原因往往不是能力不够而是应试习惯不好。笔试不只是考你会不会还考你在有限时间内如何分配注意力、如何在压力下保持代码整洁。建议准备一个错题文档把每次模拟笔试的失误分类记录考前翻一遍比刷十道新题更有价值。希望这份复盘能帮你在猿辅导或同类公司的下一场笔试里多拿一些分。