1. 笔试整体情况与考察框架
1.1 笔试形式与时间分配
我是去年秋天参加的网易2023校招计算机视觉算法工程师笔试,当时报的是正式第二批。先说结论:这场笔试整体风格偏工程落地,不考那种偏门到天际的数学证明,但也不是背背八股就能过的。整体题量大、范围广,编程题占大头,而且题目设计明显在考察你"能不能把算法用在真实业务场景里"。
笔试时间总共是120分钟,分为选择题、编程题和简答题三块。我个人的体感是:选择题30道左右、编程题3道、简答题2道,难度梯度拉得比较开。选择题大概40分钟做完,剩下80分钟做编程题和简答题,时间比较紧张,尤其是编程题如果卡住一道,后面简答题就容易被挤掉。
这里我多说一句,网易的笔试系统是自带IDE的,支持C++、Java、Python、Go这些主流语言,但不支持本地代码调试,也就是你写的代码是在网页编辑器里跑用例的。所以平时练习时建议尽量习惯"写完就提交"的方式,别指望断点调试。我身边有同学平时用IDE习惯了,笔试时一直在心里纠结格式问题,浪费了不少时间。
1.2 题型分布与考察范围
从第二批正式批的题目来看,考察范围基本可以分成四块:计算机视觉基础、深度学习与机器学习、数据结构与经典算法、数学基础。我按记忆整理了一张表格,方便大家对照自查:
| 考察模块 | 主要题型 | 占比(体感) | 涉及知识点 |
|---|---|---|---|
| 计算机视觉基础 | 选择题、简答题 | 25%左右 | 图像滤波、特征提取、目标检测、图像分割 |
| 深度学习与机器学习 | 选择题、简答题 | 25%左右 | CNN、损失函数、优化器、过拟合与正则化 |
| 数据结构与算法 | 选择题、编程题 | 35%左右 | 排序、字符串匹配、动态规划、二叉树、图论 |
| 数学基础 | 选择题、简答题 | 15%左右 | 线性代数、概率论、最优化、卡尔曼滤波 |
这个分布其实很有代表性,网易的CV岗位向来不是纯算法研究,而是要求你有工程落地能力。所以编程题的分量给得很足,而且考的不是LeetCode那种纯模板题,而是会嵌套一些业务场景,比如给你一批图像标注数据,让你设计一个算法筛选出重复样本这类,后面我会展开讲。
1.3 岗位能力模型分析
站在过来人的角度回头看,这场笔试实际上是在筛选三种能力:基础扎实度、工程编码能力、理论结合实践的能力。
基础扎实度看的是你对CV核心知识的理解深度。比如选择题里会问SIFT特征为什么具有尺度不变性、卷积感受野怎么计算、BatchNorm在训练和推理阶段的差异,这些知识点不是刷一遍题库就能覆盖的,需要真正理解原理。
工程编码能力看的是你写代码的熟练度和健壮性。3道编程题涉及字符串处理、动态规划、数组操作,中等难度偏上,有一两道需要优化到O(n log n)甚至O(n)才能过全部用例。我印象很深的一道题是用KMP思想做字符串匹配变种,如果你只会暴力解法,小数据能过,但大数据量会超时。这里建议准备的时候把经典算法的手写版过一遍,特别是KMP、快排、堆排序、二分这些高频考点。
理论结合实践的能力则藏在简答题里。比如有一道题是讲图像锐化中的拉普拉斯算子,问你为什么拉普拉斯算子的响应可能是负值,以及如何处理边界像素。这种题目靠背概念是答不好的,必须真正做过图像处理实验,知道算子卷积的完整流程,才能答到点子上。
- 核心考点深度拆解
2.1 计算机视觉基础:从图像滤波到特征提取
CV基础这部分的笔试内容,说难不难,说简单也不简单。它的特点是很喜欢把两个相近的概念放在一起考你,让你辨析。
选择题里有一道我印象很深:索贝尔算子(Sobel)和拉普拉斯算子(Laplacian)有什么区别?它们的应用场景分别是什么?这道题看似基础,但有很多细节值得展开。
Sobel是一阶微分算子,通过计算图像在x和y方向的梯度幅值来检测边缘,对噪声有一定的平滑抑制作用,因为它本质上还是做了局部加权平均。而Laplacian是二阶微分算子,对噪声更敏感,但能同时检测各个方向的边缘,不需要分别计算x和y方向的梯度。实际工程中,如果直接用Laplacian做边缘检测,经常需要先做高斯模糊去噪,这也是LoG(Laplacian of Gaussian)算子的思路来源。
另外还有一个常考点是图像锐化。有一道简答题问到:拉普拉斯算子做图像锐化时,为什么要用原图减去拉普拉斯响应?这背后的原理是,拉普拉斯算子响应为零时表示平坦区域,响应为非零时表示灰度变化剧烈的区域。把拉普拉斯响应从原图中减去,相当于在边缘处拉大对比度,从而使图像看起来更清晰。注意这里容易答反,我记得是加上或减去取决于算子定义中的符号约定,但考场上要按题目给出的算子形式来判断。
在特征提取这块,网易比较喜欢考SIFT和ORB的对比。SIFT特征是尺度不变、旋转不变的,计算量大;ORB是二进制特征,计算速度快,适合实时场景,但不具备完全的尺度不变性。选择题可能会给一个场景,比如"移动端实时AR需要做特征匹配,你会选择哪种特征"来考察你在精度和速度之间做权衡的能力。这类题没有绝对答案,关键是讲清楚取舍。
2.2 深度学习与CNN:不仅会调库,还要懂原理
深度学习部分是重头戏。网易这场笔试的难度在于,它不会直接问你"什么是卷积",而是会给你一个具体网络结构,让你计算参数量、感受野,或者推导反向传播的梯度。
比如选择题里有一道:输入特征图是H×W×C,卷积核大小为k×k,输出通道数为C_out,卷积步长为s,padding为p,问输出特征图的尺寸。这个公式相信大家都背过:输出尺寸=(H+2p-k)/s+1。但题目不会这么直白,它可能会加入空洞卷积(dilated convolution),问你在dilation=d的情况下感受野扩大了多少。这里要记住,空洞卷积引入了一个额外参数d,实际卷积核覆盖范围变成了k+(k-1)×(d-1)。
还有一个高频考点是感受野的计算。我当时抽到的是一道计算VGG网络某个卷积层感受野的选择题,需要从输入层往前推。这里有个实用技巧:从后往前推比从前往后推更容易,公式是RF_{l-1} = (RF_l - 1) × stride_l + kernel_size_l,从最后一层往前逐层推。我记得当时这道题我用了不到一分钟就算出来了,因为我把公式写在草稿纸上了。
反向传播的推导也是简答题的常客。网易比较喜欢考的是:一个包含BatchNorm的卷积网络,在训练阶段和推理阶段,BatchNorm的行为有什么不同?训练阶段用的是当前batch的均值和方差,还要维护全局的running_mean和running_var;推理阶段则直接用训练好的running_mean和running_var。还有一个容易被忽视的细节:推理阶段通常会把BN层和前面的卷积层融合,减少计算量。如果你在简历里写过"模型部署"相关的项目,这道题几乎是送分题。
2.3 机器学习基础:损失函数与优化器
机器学习基础题目在网易笔试中出现得也不少,但整体难度不大,重点考察你对概念的理解深度和边界条件的掌握。
选择题里比较典型的一道是:对于类别不平衡的二分类问题,以下哪种损失函数更适合?A. 交叉熵损失 B. 加权交叉熵 C. 均方误差 D. Hinge Loss。正确答案是B,加权交叉熵。这个知识点本身不难,但题目会进一步问你,如果正负样本比例是1:99,权重应该怎么设置?很多人会答1:99,实际上更稳妥的做法是给少数类赋予更大的权重,但权重也不一定完全按反比来,需要结合验证集调参。
另外,网易还挺爱考优化器的。SGD、Momentum、RMSProp、Adam这四者的对比几乎是必考。我记得有一道选择题问:在鞍点处,哪个优化器更容易逃离?这题的坑在于,很多人以为SGD带Momentum就好,实际上Momentum确实能用累积动量冲出鞍点,而Adam因为自适应学习率,在梯度很小时步长会变大,也具备一定逃离能力。关键在于题目如果限定"只选一个",最好选Momentum,因为Adam在梯度噪声较大的情况下可能会震荡,逃离效率反而不稳定。
还有一个我私心觉得会被很多人忽略的点:机器学习里的过拟合与正则化。网易的题很少直接问L1和L2的区别,而是喜欢给一个训练曲线,让你判断是否过拟合以及怎么解决。这时候你要答出数据增强、Dropout、Early Stopping、正则化、降低模型复杂度这几个方向,同时还要结合CV场景,说明哪些方案在图像任务里更常用。
2.4 数据结构与经典算法:编程题的核心弹药库
根据我的观察,网易笔试的编程题重点集中在字符串、动态规划、数组操作、二叉树和图论这几类,难度介于LeetCode中等偏难。
先说排序算法。选择题里会考排序算法的稳定性:快排不稳定、堆排不稳定、归并稳定、插入稳定。还有一道题问:在一个几乎有序的数组中,以下哪种排序算法性能最好?答案是插入排序,因为当数组接近有序时复杂度接近O(n)。网易不直接考你"冒泡排序C++代码怎么写",而是考你"同一个算法在什么场景下最优",这是典型的工程思维考察方式。
字符串匹配是网易笔试的高频考点。热搜词里有KMP,我笔试时也遇到了KMP相关的变种题。经典KMP的next数组怎么求,这个必须会手写。我先给一个C++版本供参考:
vector<int> buildNext(const string& p) { int m = p.size(); vector<int> next(m, 0); int j = 0; for (int i = 1; i < m; i++) { while (j > 0 && p[i] != p[j]) { j = next[j - 1]; } if (p[i] == p[j]) { j++; } next[i] = j; } return next; }其实笔试里不会直接让你默写KMP,而是给一个场景,比如"在长字符串中查找所有与模式串相似的子串,允许k个字符不匹配",这种变种题用KMP的next思想来优化暴力匹配,才能保证时间复杂度达标。所以不要只会背模板,要理解next数组的本质是"当匹配失败时,模式串可以向右滑动多远"。
动态规划也是必考。我抽到的是一道类似"最长公共子序列"的变种,但背景换成了图像特征点匹配。题目给你两个特征点序列,让你求最长连续匹配的子序列长度。本质上还是LCS的思路,但边界条件需要根据题目调整。这里我建议把DP的经典题型都练熟:最长递增子序列、0-1背包、编辑距离、最长公共子串/子序列,这几个基本够用。
- 典型真题解析与解题思路
3.1 编程题实战:用KMP变种解决字符串匹配
笔试的3道编程题里,有一道让我印象很深。题目的描述大概是:给定两个字符串S和P,要求在S中找到所有P的"近似匹配"起始位置,允许最多k个字符不同。
看到这个题目,第一反应可能是暴力:枚举S中每个长度为|P|的子串,逐个比较,复杂度是O(n×m),在数据量大时肯定超时。第二个反应是用KMP或Z算法扩展,但KMP针对的是精确匹配,对"允许k个不同字符"的支持需要额外设计。
我当时用的是类似KMP的滑动思路:先用KMP的next数组预处理模式串P,然后在匹配过程中维护一个"失配计数",如果失配计数超过k,就回溯到上一次可能的位置。这里我给出一个可运行的参考实现:
#include <bits/stdc++.h> using namespace std; vector<int> buildNext(const string& p) { int m = p.size(); vector<int> next(m, 0); for (int i = 1, j = 0; i < m; i++) { while (j > 0 && p[i] != p[j]) j = next[j - 1]; if (p[i] == p[j]) j++; next[i] = j; } return next; } vector<int> approximateKMP(const string& s, const string& p, int k) { vector<int> res; int n = s.size(), m = p.size(); vector<int> next = buildNext(p); int j = 0, mismatch = 0; for (int i = 0; i < n; i++) { while (j > 0 && s[i] != p[j]) { if (mismatch < k) { mismatch++; break; } j = next[j - 1]; mismatch = 0; } if (s[i] == p[j]) { j++; } else { mismatch++; } if (j == m) { if (mismatch <= k) { res.push_back(i - m + 1); } j = next[j - 1]; mismatch = 0; } } return res; }这个实现并不完美,边界条件需要根据题目要求微调,但整体思路是对的:在传统KMP基础上引入一个失配计数器,当失配超过阈值时回退到next所指的位置,而不是直接从头开始。
踩过的坑是:网上很多KMP模板用的是next[i]表示"前i个字符的最长相同前后缀长度",有的用-1作哨兵,笔试时如果记忆混淆很容易写错。我建议平时练习时固定一种写法,不要频繁切换,考试时肌肉记忆比临场推导更可靠。
3.2 CV理论题实战:目标检测中的NMS与IoU计算
简答题里有一道目标检测相关的题,要求解释NMS(非极大值抑制)的完整流程,并说明IoU的计算方式。这道题说难不难,但完全答好也不容易。
NMS的完整流程应该是:
- 对某一类别的所有检测框,按置信度从高到低排序。
- 取置信度最高的框A,将其加入最终保留列表。
- 计算A与其余所有框的IoU。
- 删除与A的IoU超过阈值(通常0.5)的框。
- 对剩余框重复步骤2-4。
这道题的深层考点在于,很多同学会把NMS当成一个"死记硬背"的流程,但没有意识到它的核心目的是解决同一个物体被多个检测框重复框住的问题。如果你能补充说明NMS在边缘情况下的处理,比如当两个不同物体的框重叠度较高时NMS会误删,就能体现出你对算法局限性的理解。
IoU的计算公式是交并比=交集面积/并集面积。实际上代码实现时有几个细节:交集区域的宽=min(x1_max, x2_max)-max(x1_min, x2_min),高同理,如果任何一边为负则交集面积为0。这个细节很容易被忽略,但笔试可能会让你写伪代码,所以要记牢。
我整理一个简短的实现参考:
struct Box { float x1, y1, x2, y2; float score; int label; }; float iou(const Box& a, const Box& b) { float inter_w = min(a.x2, b.x2) - max(a.x1, b.x1); float inter_h = min(a.y2, b.y2) - max(a.y1, b.y1); if (inter_w <= 0 || inter_h <= 0) return 0.0f; float inter_area = inter_w * inter_h; float union_area = (a.x2 - a.x1) * (a.y2 - a.y1) + (b.x2 - b.x1) * (b.y2 - b.y1) - inter_area; return inter_area / union_area; } vector<Box> nms(vector<Box>& boxes, float iou_threshold) { sort(boxes.begin(), boxes.end(), [](const Box& a, const Box& b) { return a.score > b.score; }); vector<Box> result; while (!boxes.empty()) { Box cur = boxes[0]; result.push_back(cur); boxes.erase(boxes.begin()); vector<Box> remaining; for (auto& b : boxes) { if (iou(cur, b) <= iou_threshold) { remaining.push_back(b); } } boxes = remaining; } return result; }这种题在笔试里属于"必须拿分"的送分题。备考时建议把常见CV流程的伪代码都过一遍,包括特征匹配的RANSAC、图像金字塔、Haar特征等。
3.3 数学基础实战:卡尔曼滤波与贝叶斯更新
热搜词里有卡尔曼滤波算法,这个出现在网易CV算法笔试里并不意外,因为卡尔曼滤波在目标跟踪、SLAM、自动驾驶感知中都是核心算法。网易的考题不是让你推导完整的卡尔曼滤波公式,而是考思想。
我记得有一道选择题:在卡尔曼滤波中,预测步骤和更新步骤分别由哪些公式描述?选项里混入了粒子滤波的公式来迷惑你。这就考察你能不能分清两个概念。
卡尔曼滤波的核心是两大步骤:预测(Predict)和更新(Update)。预测阶段利用状态转移方程预测当前时刻的状态和协方差;更新阶段利用观测值对预测结果进行修正。修正的程度由卡尔曼增益K决定,K越大,越相信观测值;K越小,越相信模型预测值。
有一个类比很形象:你在追踪一个移动目标,模型告诉你"目标应该在这里",传感器观测到"目标在那里"。卡尔曼滤波就是给这两个来源的信任度分别加权,最后得到最优估计。这个加权过程就是贝叶斯更新的线性版本。
简答题里可能还会问你卡尔曼滤波的假设条件:系统是线性的、噪声是高斯分布的。如果系统是非线性的,需要扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)。这里要注意,网易可能会把EKF和UKF的区别作为加分项来考,你可以从"一阶线性化"和"采样逼近"的角度回答。
- 常见问题与排查技巧实录
4.1 时间分配:编程题卡壳是最大的坑
我考完最大的感受是,时间分配直接决定最终成绩。身边至少有三个同学跟我说,编程题第一道卡了快40分钟,导致后面两道编程题和简答题匆匆扫一眼就交卷了,结果自然不理想。
这里我给一个我验证过的时间分配方案,供大家参考:
- 发卷后的前5分钟,快速浏览全卷,标记出编程题的大致难度。
- 先做选择题,控制在35-40分钟以内。选择题里如果遇到卡壳超过2分钟的题,先标记跳过,不要恋战。
- 编程题按"先易后难"的顺序做,每道题分配15-20分钟。如果一道题超过25分钟还没有AC,果断放弃写暴力解或部分分。
- 简答题留15-20分钟。简答题是按点给分的,先写核心公式和结论,再补充细节,保证能拿到大部分分数。
我个人的经验是,网易笔试的选择题很多都是"看起来简单但有一两个陷阱",比如计算感受野时忘记算padding、BatchNorm训练和推理阶段的统计量差异等。所以选择题不能做得太快,至少要留出检查时间。
4.2 易错点与细节陷阱清单
我把这次笔试判断题里容易踩的坑整理成了一个清单,考前过一遍可以帮你避免很多低级失误:
| 易错点 | 正确理解 | 错误理解 |
|---|---|---|
| Softmax输出和为1 | 多分类概率归一化使用 | 二分类也能直接用 |
| ReLU在负数区间梯度为0 | 导致Dead ReLU问题 | 梯度恒为0但参数不更新 |
| Dropout在训练/推理阶段差异 | 训练时随机失活,推理时保留全部并缩放权重 | 推理时也随机失活 |
| BN在训练/推理阶段差异 | 训练用batch统计量,推理用全局统计量 | 两者一样 |
| 交并比IoU取值范围 | 0到1之间 | 可以大于1 |
| KMP的next数组定义 | 表示最长相等前后缀长度 | 表示失配后跳转的索引 |
这些细节单独看很简单,但在限时笔试的高压环境下很容易出错。我建议考前专门整理一份自己的"易错本",每次模拟考试前翻一遍,比刷十道新题更有效。
4.3 考后复盘与面试衔接经验
笔试结束后,不管感觉好坏,我建议你马上把还记得的题目记下来。网易的笔试题库很大,但同一批次的题目风格和考点是相近的。我当时考完就在手机备忘录里记录了十几道题的关键词,后面复盘时发现很有用。
尤其要注意的是,笔试中答得不好的题目,往往会是面试环节的重点考察方向。比如我当时笔试里有一道关于图像锐化的拉普拉斯算子简答题没答好,结果面试时面试官就问到了图像增强的知识点,好在我笔试后专门补了这块,才没有在面试中再次翻车。
所以我的建议是:笔试后的48小时内,趁记忆还热乎,把不会的题目对应的知识块补齐。这不只是为了笔试,更是为后面的面试做铺垫。网易的面试官明显会参考你的笔试成绩,在面试中针对你的薄弱点进行深度追问。
5. 备考资源与实战建议
5.1 经典书籍与公开课
关于备考资源,我给不了大家"看这个就行"的万能答案,但可以分享一些我自己实际用下来觉得有帮助的资料。
计算机视觉方面,我推荐复习的时候以教材为主,不用太深究太前沿的论文。重点吃透图像滤波、边缘检测、特征提取、传统机器学习、CNN基础结构这几块。有一本英文专业书内容比较全,适合按章节查漏补缺,但不需要从头到尾啃。
深度学习方面,建议先把核心概念过一遍:卷积计算、池化、激活函数、损失函数、优化器、BN、Dropout、经典网络结构(VGG、ResNet、MobileNet)。还有一个容易忽略的知识点是感受野的计算,我笔试时至少遇到了两道跟感受野相关的题。
编程算法方面,我强烈建议把LeetCode的热题100题刷透,特别是字符串、动态规划、二叉树的题。网易笔试的编程题风格偏向"经典题+业务包装",比如"字符串匹配变种"本质上还是KMP或滑动窗口。如果你能把这些题型练到"条件反射"程度,笔试编程题大概率能AC两道以上。
5.2 刷题策略:不是越多越好
很多同学备考时喜欢"一天刷十道题",但效果往往不好。我的经验是:刷题的质量比数量重要得多。
对于校招笔试,我建议按以下顺序准备:
- 先把数据结构和算法的基础打牢:数组、链表、栈、队列、哈希表、二叉树、图论基础。
- 再把经典算法逐个攻克:排序(快排、归并、堆排)、二分、KMP、动态规划经典题、DFS/BFS、最短路径。
- 然后做"场景化"训练,比如把一道普通的字符串题套在CV或推荐场景里重新描述,锻炼自己把业务问题抽象成算法模型的能力。
- 最后做限时模拟,每次模拟要严格按照考试时间和环境来。
我当时刷题时有一个习惯:每道题AC之后,会尝试用至少两种方法解。比如一道最长递增子序列的题,可以用O(n^2)的DP,也可以用O(n log n)的贪心+二分。笔试时如果一种方法超时,立刻切换另一种,这种灵活应变的能力在限时环境下非常重要。
5.3 考前一周的冲刺建议
考前一周,不建议再大量刷新题了。我当时做的是三件事:回顾错题、整理公式、模拟考试。
回顾错题不是只看答案,而是把每道题的解题思路重新在草稿纸上推演一遍,确保自己真正理解了,而不是"背住了"解题步骤。整理公式是指把CNN感受野公式、输出尺寸公式、IoU计算公式、KMP next数组模板等高频公式抄在一张A4纸上,考前反复看。
模拟考试是最重要的。找一套往年的真题或高质量的模拟题,严格按照120分钟来做,中间不暂停、不翻资料。模拟结束后,重点分析"哪些题是本来会但没时间做"以及"哪些题是浪费时间太多导致没做完",针对性调整时间分配策略。
我考前做了三次限时模拟,每次都能发现一个时间分配上的问题,到真正笔试时已经形成了比较稳定的节奏。
写在最后
回头看看这场笔试,我最大的体会是:网易的题目其实难度不算顶级,但它考察得非常全面,而且很看重"理论+工程"结合的能力。算法题本身就是很多CV算法工程师的痛点,因为平时做实验写脚本习惯了,手写KMP、手写DP的状态不好。但这恰恰是校招笔试和日常工作的分水岭,想在笔试里拿到好成绩,必须刻意练习手写代码的能力。
另外再多说一句,笔试只是校招的第一关,但它往往会影响后续面试的走向。网易的面试官能看到你的笔试答卷,如果你的编程题答得很好,面试时会更侧重考察你的项目深度;如果笔试表现一般,面试官可能会花更多时间考察基础题。所以笔试的优先级真的不低,值得投入足够的时间去准备。
希望这篇复盘对正在准备大厂CV算法岗校招的同学有帮助。如果后面有需要,我可以再单独写一篇面试环节的复盘,把我在网易面试中被追问到的那些技术细节整理出来。祝大家笔试顺利,offer到手。