
又到了校招季正好有不少人私信问我去年网易2023校招算法工程师的笔试情况。我参加的正是正式批第一批这套题做下来最大的感受是编程题不算偏但选择题范围宽而且时间卡得很紧。从投递简历到笔试再到最终拿到意向书这条路我完整走了一遍所以想把这次笔试复盘和经验整理出来。这篇东西不只在讲某一道题的解法更想说明白校招笔试这套筛选逻辑是什么、算法工程师岗位在笔试里到底考什么、以及考前最后几天应该怎么准备。无论你是正在准备秋招的应届生还是打算往算法方向转的同学按这个思路去准备至少不会在笔试环节吃大亏。1. 先把笔试这件事看透网易校招笔试的结构与隐藏逻辑1.1 题型结构选择题和编程题分别筛选什么网易校招笔试一般安排在线上平台限时完成整套卷子由选择题和编程题两部分组成。选择题范围覆盖数据结构、操作系统、计算机网络、数据库这些计算机基础算法岗还会额外掺入一些概率统计、机器学习基础题。编程题通常在2到3道之间占分最大基本决定你能不能进入后续面试。很多人会有一个误区算法工程师岗笔试最重要的是刷LeetCode选择题随便准备就行。我第一年也是这么想的结果差点在选择题上翻车。校招选择题考察的是“你大学四年到底学没学过计算机基础”编程题考察的是“给定一个明确问题你能不能快速写好代码”。两者筛选维度不同但权重都很高。我复盘了一下网易这套笔试题选择题里数据结构考察得很细比如链表的边界操作、二叉树的遍历方式、哈希冲突的处理策略都是老生常谈但特别容易混淆的知识点。操作系统则偏好进程线程区别、死锁条件、虚拟内存计算机网络则经常问TCP三次握手、拥塞控制、HTTP状态码。算法岗特有的概率题通常是贝叶斯公式、期望计算这种虽然不难但如果你很久没碰数学现场容易发懵。1.2 岗位差异算法工程师笔试和后台开发笔试不是一回事同样是笔试后台开发岗和算法岗的侧重点有明显差异。后台开发更偏重工程能力编程题里会出现系统设计、并发处理、大数据量排序之类的场景算法岗的编程题更偏重数据结构与算法的基本功题目本身不涉及复杂业务但要求你能快速识别出题目背后是哪种算法模型。与此同时算法岗笔试的选择题会多出一块“机器学习基础”内容。比如损失函数的选择、过拟合的处理手段、常见分类模型的适用场景。这些知识点不需要你手推公式但你要懂核心思想。我在准备阶段复盘了近两年网易和其他大厂的算法岗笔试题发现一个规律它们对深度学习框架、具体模型结构的考察极少更多考察的是传统机器学习算法和数学基础。原因很简单校招同学在校项目里用框架写得天花乱坠但很多人连“交叉熵为什么能衡量分布差异”都答不上来笔试就是用来筛掉这种基础不牢的简历。1.3 为什么大厂偏爱限时编程题有人会问为什么明明有简历筛选还要用一套硬核的限时编程题来筛人我的理解是这样的编程题可以在最短时间内横向比较大量候选人的代码能力而且几乎无法作弊。简历可以包装项目可以注水但让你限时在白板/网页编辑器里从零写一个函数几斤几两一试便知。更重要的是限时编程题模拟的是真实工作场景。一位算法工程师日常并不只是调参训模型大量时间花在数据清洗、特征工程、评估脚本和模型服务化上这些都要求扎实的编码功底。我在笔试过程中深刻的体会是限时两小时看起来充裕实际上三道编程题加二十几道选择题平均每道题的时间也就几分钟一旦某道题卡住整场节奏都会被拖垮。所以平时练习必须卡时间不能泡在IDE里慢慢磨。2. 高频算法考点拆解字符串、图论、动态规划一个都不能放过2.1 字符串系KMP的next数组到底怎么算字符串题在算法工程师笔试里出现的概率极高尤其KMP算法几乎成了必考题。网上总有传言说KMP“面试不考、工作不用”但校招笔试就是喜欢考因为它是少有的既能考察“字符串匹配思维”又能在短代码里体现算法精髓的知识点。先明确一下next数组的定义不同教材定义不同这里采用一种最常见的next[i]表示模式串p[0..i-1]这个子串的最长相等前后缀长度。也就是说对于每个位置i我们要算的是它前面那段字符里前缀和后缀最多能重合多长。计算逻辑可以用一个递推过程def build_next(p): m len(p) nxt [0] * m j 0 for i in range(1, m): while j 0 and p[i] ! p[j]: j nxt[j - 1] if p[i] p[j]: j 1 nxt[i] j return nxt网上热词里有一道典型题对模式串 p abacaba求其next数组。我们用手算来一遍。i1子串是a最长相等前后缀长度为0i2子串是ab前缀a和后缀b不相等为0i3子串是aba前缀a等于后缀a长度为1i4子串是abac前缀a与后缀c不匹配前缀ab与ac也不匹配为0i5子串是abaca前缀a等于后缀a长度1i6子串是abacab前缀ab等于后缀ab长度2i7子串是abacaba前缀aba等于后缀aba长度3。所以next数组是 [0,0,0,1,0,1,2,3]如果按next[0]0length7则数组长度是7还是8取决于下标定义要看题目要求。这道看起来简单的题实际错误率很高因为大家容易在i4和i5处算错。这里想特别强调一件事手算next数组时不要跳步每一步都要把“当前子串的所有前缀和后缀列出来再比较”做一遍等熟练之后再在心里速算。笔试里如果遇到KMP变体最稳妥的办法是直接写出上面这个build_next函数再根据题目要求做匹配而不是在草稿纸上手推一套专用逻辑。2.2 图论系Dijkstra与BFS/DFS的混合题型图论题在校招笔试里出镜率也很高网易尤其爱出最短路径相关的题目。常考的特征是“给定一个n个节点m条边的无向带权图求从起点到终点的最短路径”。这种题最直接的解法就是Dijkstra算法但必须用堆优化版本否则在n达到10的5次方级别时会超时。堆优化Dijkstra的核心思想是用优先队列维护当前未确定最短路的节点中距离最小的节点每次取出队首节点并松弛其邻边如果某条边能产生更短距离就更新并推入队列。给你一份可以直接抄的模板import heapq def dijkstra(n, edges, start): graph [[] for _ in range(n)] for u, v, w in edges: graph[u].append((v, w)) graph[v].append((u, w)) dist [float(inf)] * n dist[start] 0 pq [(0, start)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in graph[u]: nd d w if nd dist[v]: dist[v] nd heapq.heappush(pq, (nd, v)) return dist这个模板我笔试时直接默写出来节省了大量时间。不过要注意Dijkstra只适用于边权非负的图。如果题目中的边权全部为1那根本不用Dijkstra直接BFS就能求最短路时间复杂度还更低。有同学看到“最短路”三个字就条件反射写Dijkstra反而把简单问题复杂化。笔试题还有一个常见套路是把网格地图转换为图来求解。比如“给定一个二维矩阵0代表空地1代表障碍求从左上角到右下角的最短步数”这就是典型的BFS。如果你能把图论模板背熟并理解BFS、Dijkstra的适用边界图论题基本不会丢分。2.3 动态规划与贪心从“会背模板”到“会选状态”动态规划和贪心是算法工程师笔试的分水岭。简单题大家都会难题靠的就是状态定义和转移方程。网上热词里有大量关于排序、贪心、DP的内容说明这些知识点确实是校招刷题的高频区。关于动态规划我建议准备时抓住几个高频模型0-1背包、完全背包、最长递增子序列、最长公共子序列、编辑距离、区间DP。每一类模型都要做到“能推导、能默写、能变形”。比如0-1背包空间优化为滚动数组后内层循环为什么要倒序遍历这个原理必须清楚因为一道题稍微变个条件比如要求恰好装满背包就需要你调整初始化和遍历方向。贪心题目的难点在于证明贪心策略的正确性。笔试中很多贪心题看起来可以做但你没证明就写很容易掉进反例的坑。我的经验是如果一个题看起来能贪心先花两分钟试着构造反例构造不出来再用贪心思路写代码。如果构造出了反例马上转DP或二分答案等其他思路。有一类典型案例是“会议室安排最多场次”的变体题贪心策略是按结束时间排序这背后的逻辑是每一步都选择结束时间最早的会议为后续留下更多空间。这种证明必须掌握因为面试官很可能顺着笔试题目追问“为什么这样贪心是对的”。3. 在线笔试的求生细节很多人在提交之前就输了3.1 输入输出格式读题多花30秒调试省半小时笔试平台通常不是LeetCode那种已经帮你封装好函数的形式而是要求你从标准输入读数据再把结果打印到标准输出。这意味着输入输出本身的处理就能卡住一批人。常见的有三种输入场景第一种是单组测试直接读固定格式的数据第二种是有T组测试每组做一遍同样的逻辑第三种是不给你组数要求一直读到文件末尾也就是EOF。这三种场景的读法完全不同如果题目要求EOF结束而你只读到第一组数据就会漏掉大量用例得到Wrong Answer。Python下可以用这种写法来处理“若干组以EOF结束”的场景import sys for line in sys.stdin: n, m map(int, line.split()) solve(n, m)C则常用while (cin n m) { solve(n, m); }另外输出格式也要注意有些题目要求每个结果之间用换行分隔有些要求最后一行也有换行。这些细节看起来不起眼但会导致Presentation Error。我笔试时习惯先看一遍样例输入输出确认格式后再动笔写逻辑这个习惯帮我避开了很多坑。3.2 复杂度估算拿到题先看数据范围再定算法在线笔试和平时刷题有个很大的不同你没法立刻知道数据范围。题目描述里会给n、m的取值范围这个信息极其关键直接决定了你该用哪种算法。我总结了一张自己常用的速查表数据规模可接受的时间复杂度典型算法思路n 20O(2^n) 或 O(n!)状态压缩、暴力搜索n 100O(n^3)Floyd、三重循环、区间DPn 1000O(n^2)朴素DP、双指针n 10^5O(n log n) 或 O(n)排序贪心、堆、线段树、滑动窗口n 10^9O(log n) 或 O(1)二分答案、矩阵快速幂、数学公式拿到题先看n的范围再去想算法这个顺序不能反。我见过太多人拿O(n^2)的去处理10^5量级的数据最后超时然后开始疯狂优化常数其实从一开始方向就错了。如果n是10^5而你想到了排序贪心的O(n log n)解法那这道题的思路基本就稳了。3.3 边界与防御写一个会“挑刺”的自己笔试程序最恶心的错误不是逻辑错而是边界情况没处理好。空数组、单元素数组、全部元素相同、字符串首尾带空格、坐标越界、整型溢出、浮点数相等比较这些都是提交后才会暴露的坑。我的习惯是代码写完后不急着提交花两分钟构造三组特殊用例——最小规模、最大规模、全是极端值。比如题目让你求最长递增子序列我就测一下n1的情况如果题目涉及求和我就测一下全为最大值的用例检查会不会爆int范围。Python的int没有溢出问题但C里int和long long的切换很容易出问题。笔试现场时间紧迫一旦你只顾着写主流程而忽略边界很可能交完才发现自己的程序在n1时直接报错。4. 现场还原三道有代表性的笔试编程题4.1 滑动窗口求满足条件的最短子串网易笔试题中有一类出现频率特别高的滑窗题题目大致是这样的给定一个字符串s和一个目标字符串p求s中包含p所有字符的最短子串长度。这道题的考点就是滑动窗口它的思路比暴力要巧妙得多但代码量也不大。实现思路用“需求表缺失计数”两步走。先用哈希表记录p中每个字符的需求量再用两个指针left和right维护当前窗口。right每扩展一个字符如果该字符仍然“缺”就减少缺失计数当缺失计数归零说明当前窗口已经覆盖了p此时尝试移动left缩小窗口直到窗口不再满足条件。整个过程中记录最短窗口长度即可。以下是参考代码from collections import Counter def min_window(s, p): need Counter(p) missing len(p) left 0 res (float(inf), 0, 0) for right, ch in enumerate(s): if need[ch] 0: missing - 1 need[ch] - 1 if missing 0: while left right and need[s[left]] 0: need[s[left]] 1 left 1 if right - left 1 res[0]: res (right - left 1, left, right) need[s[left]] 1 missing 1 left 1 return if res[0] float(inf) else s[res[1]:res[2] 1]这个模板需要注意的是need中的计数会变成负数表示窗口内该字符数量超出需求这是判断左指针能否收缩的关键。笔试时如果时间紧可以直接套模板但建议你自己在本地多跑几组用例验证一下因为“窗口内字符超出需求”和“窗口仍有效”这两者的逻辑关系非常容易写错。4.2 堆优化Dijkstra网络最短时延问题还有一道比较典型的图论题题目大概是给定一个包含n个节点的网络图每一条边都带有传输时延现在从某个节点发出一条消息求消息广播到所有节点所需的最短时间。这题的思路其实就是求从源节点出发到所有节点的最短路径答案就是其中最长的最短距离。我直接套用了前面给出的堆优化Dijkstra模板然后取dist数组的最大值作为答案。写起来大概只需要十分钟。这道题之所以值得复盘是因为它考察的不只是Dijkstra本身还包括一个额外的转化要求的是所有节点收到消息的时间不是某一个目标节点所以答案等于最短路中的最大值。很多同学把Dijkstra写出来以后却忘了取max白白丢分。顺带一提如果这个题改成“是否存在节点无法收到消息”那还需要检查dist数组中是否有节点仍是无穷大。这类边角条件往往就是笔试的隐藏分写的时候一定要多问自己一句题目里有没有类似“全部节点可达吗”的隐含要求。4.3 排序之后的区间合并思维题往往更考验代码简洁度网易笔试编程题里也会出现一些看起来并不“算法”的题比如区间合并给定一系列区间合并所有重叠区间输出合并后的区间个数或总长度。题意很简单但代码写得干不干净很考验基本功。解题步骤也很直接先把区间按左端点排序然后遍历所有区间维护当前合并后的右边界。如果当前区间左端点大于右边界说明无法合并把当前区间收入结果否则更新右边界为两者中的较大值。参考代码def merge(intervals): if not intervals: return [] intervals.sort(keylambda x: x[0]) res [] for l, r in intervals: if not res or l res[-1][1]: res.append([l, r]) else: res[-1][1] max(res[-1][1], r) return res这道题想提醒大家的是不是你只会高阶算法就能拿高分能把简单的数据结构题写得又快又准往往才是笔试拿满分的保障。现场答题时最怕“想太多”区间合并一上来就脑补线段树优化结果不仅增加代码量还可能因为复杂度过高而写错边界反而不如基础的排序加贪心。5. 算法工程师岗位的“隐藏考点”机器学习与大模型5.1 数学与机器学习基础选择题里藏着真功夫算法工程师笔试和普通开发岗笔试最大区别就是选择题中会出现数学和机器学习内容。网易这笔试也不例外。我记得选择题里出现了贝叶斯公式求后验概率的题目还有一道关于交叉熵损失函数的选择题选项分别是MSE、交叉熵、Hinge Loss等在不同场景下的表现。如果你只刷题不看机器学习基础这两道题基本没法做。我建议大家准备时重点复习几个模块概率论中的贝叶斯公式、期望与方差、常见分布机器学习中的偏差与方差、过拟合与正则化、常见损失函数、决策树与随机森林的差异、SVM的核函数思想。很多内容不需要手动推导公式但你要能理解“为什么用这个”而不是“怎么算这个”。此外有一类认知题也常出现比如“当训练集和测试集分布不一致时以下哪种处理方式最有效”。这种题没有标准公式可以套考的是你对机器学习流程的整体理解。我的建议是遇到这种题不要凭记忆去猜而是从实际业务逻辑去推理。笔试出题人的逻辑其实很简单他们想看你是不是只会在Jupyter Notebook里跑模型。5.2 大模型时代算法工程师正在被提出新要求2023年这批校招一个明显的信号是大模型相关内容开始出现在算法工程师的考察范围里。虽然网易笔试的编程题没有直接让你实现Transformer但选择题里已经出现了关于注意力机制、推理加速等方向的基础问题。热词里有“AI算法工程师必知必会 入门llama.cpp”这其实反映了行业对算法工程师的新期待不仅要会训练模型还要懂推理部署和性能优化。如果你正在准备算法工程师校招我建议在大模型方向做三件事第一完全理解Transformer的self-attention机制知道Q、K、V从哪里来到哪里去第二了解常见的推理优化手段比如量化、剪枝、蒸馏、KV Cache至少知道它们分别解决什么问题第三动手跑通一个开源大模型的本地推理流程选一个轻量项目能够讲清楚从下载权重到调用推理接口的完整链路。哪怕笔试不直接考面试时也几乎必问。6. 备考时间线与临场策略我把自己的安排写在这里6.1 提前三个月以刷题和基础为主的储备期校招笔试准备不能靠考前一周突击我的时间线是提前三个月开始。前两个月主要做两件事一是把数据结构与算法的基础知识系统过一遍包括数组、链表、栈、队列、树、图、哈希表、排序、二分、动态规划、贪心二是每天固定刷2到3道LeetCode中等难度题优先覆盖高频考点。我还做了一件事就是建立自己的“模板库”。把KMP、Dijkstra、并查集、滑动窗口、二分答案、线段树等常用算法整理成可以直接复用的代码片段并且每段都自己默写过至少三遍。笔试时直接调用这些模板能节省大量时间。注意模板库不是抄一遍就完事的你要能默写出来因为笔试平台没有你本地的代码片段可复制。6.2 提前一个月真题、周赛和模拟环境最后一个月重心从“学”转向“测”。我会每天做一场线上模拟笔试用牛客网或LeetCode周赛的限时模式练习要求自己两小时内完成所有题目严格模拟真实的考试节奏。这个过程非常痛苦但也非常有效。第一次模拟我甚至没有做完第一道题但练到第五次时已经能稳定在三道题中提交两道并保证正确率。模拟时要注意一个细节真实笔试的在线编辑器通常不带自动补全和语法检查有些平台连本地调试都不方便。所以我平时刷题时会特意在网页编辑器中写代码不依赖IDE的提示这样到了考场不会因为“代码助手消失”而手忙脚乱。6.3 笔试当天时间管理、环境检查和心态笔试当天我给自己定的策略是“先扫卷再动手”。拿到卷子先不急着写代码用5分钟浏览所有题目评估每一道题的难度。然后按“会做的先做不会做的标记后做”的顺序执行。选择题通常会先快速过一遍遇到卡壳的不纠结直接蒙一个并标记等到最后有空余时间再回看。环境上也有几个建议提前测试浏览器兼容性有些在线笔试平台对浏览器有特殊要求关闭所有可能弹窗的软件包括微信、邮件提醒避免考试过程中被切出页面某些平台会记录切屏次数严重时直接判作弊。最后预留至少十分钟检查代码里的print拼写、输入函数是否写对、输出格式是否和样例一致。我见过不少同学算法思路完全正确却因为printf写成了print而全盘得零分这种损失太不值得。结尾一点个人体会真正经历完整套流程后我最大的感受是校招笔试筛的从来不是“天才”而是“稳的人”。算法题谁都会说思路但能在限时、没有IDE辅助、精神高度紧张的情况下把代码一次写对、把边界测全、把复杂度算清楚这才是企业真正需要的能力。我个人在准备后期把大量时间从“刷新题”改成了“重复默写模板和复盘错题”这个转变让我在笔试现场心里踏实了很多。最后再分享一个实用小技巧笔试交卷前花10秒看一眼屏幕右下角的时间如果还有剩余把每道题的最小边界用例在脑子里跑一遍往往能救回不少分。希望这篇复盘对你有用祝今年校招顺利。