计算机视觉算法岗笔试核心考点与通关攻略
计算机视觉算法工程师的笔试是最能拉开差距的一环。金山办公这类做办公软件与文档处理的公司笔试考的不只是“会不会调模型”而是把数据结构、图像处理、机器学习、深度学习几块基础能力揉进一张卷子里综合考。尤其是计算机视觉岗位图像处理部分的比重明显高于纯后端岗位题目风格也贴近实际业务比如文档扫描、OCR、拍照增强这些场景。这篇文章我按校招笔试常见的出题逻辑把计算机视觉算法方向的核心考点从头到尾拆一遍考什么、为什么考、怎么准备然后把每个关键题型对应的思路、代码、易错点都过一遍。准备投视觉算法岗位的应届生可以拿来自查计划转行做视觉算法的工程师也能用来补基础。文章不追求把每个算法都写到最深的推导重点是帮你在有限时间内抓住高频考点少踩别人踩过的坑。1. 试卷整体结构与考点逻辑1.1 岗位要求倒推考点分布先想清楚一件事笔试不是随机抽题而是从岗位日常工作倒推出来的。计算机视觉算法工程师平时做的事情大概有几类图像和视频数据的预处理降噪、增强、几何校正、检测识别分割模型的训练和调参、模型在移动端或服务端的部署优化以及把算法落到具体产品场景里比如 WPS 的拍照扫描、PDF 转 Word、文档 OCR。把这些工作拆开看需要的底层能力就清楚了笔试的考点也随之而来。我整理了一下这类岗位校招笔试最常见的内容分布不一定跟某一年的具体卷子完全一致但大致是这个框架。考查模块常见题型主要考点数据结构与算法选择、简答、手写代码KMP、排序、快速幂、贪心、动态规划图像处理基础选择、简答、手写代码Sobel、拉普拉斯、直方图均衡、插值机器学习基础选择、简答KNN、聚类、特征归一化、损失函数深度学习与视觉模型选择、简答卷积原理、目标检测思路、感受野场景设计题开放性问答文档矫正、OCR预处理、工业质检C/Python编程手写代码矩阵操作、字符串处理、复杂度优化从表格能看出来这张卷子表面上是考“算法”实际上是在验证你能不能独立完成一个视觉任务从输入到输出的完整链条。数据结构和编程是工具图像处理是看家本领机器学习深度学习是进阶储备场景题是考察你把前面所有知识串起来解决业务问题的能力。1.2 出题逻辑为什么这样筛选候选人校招笔试的时间通常只有一个半小时到两个小时要在这么短时间里筛出基础扎实的人题目就必须“覆盖面广但单题不深”。纯后端岗位会重点考各种复杂数据结构而计算机视觉岗位会额外加图像处理题这是因为视觉任务的第一道工序往往就是图像预处理。我见过不少同学复习时只刷 LeetCode结果笔试一看到 Sobel 算子就懵了。反过来也有同学天天调模型对 KMP 这种“老掉牙”的算法完全不熟编程题直接挂了。这类笔试最典型的筛选逻辑是不要求你在单个难题上做到满分但每个基础模块都不能有明显短板。换句话说它考的不是上限而是下限。另外WPS 这种办公软件的核心场景决定了图像处理题的出题偏好。拍照扫描、文档去阴影、文字增强、版面分析这些功能都要求工程师对像素操作有直觉。所以考直方图均衡、考边缘检测、考透视变换不是随便找几个知识点而是这些算法真的每天都在产品里跑。你答题时如果能往业务场景上靠一靠比如提一句“自适应阈值适合光照不均的文档照片”判定分通常会更高。1.3 视觉岗题目的独特之处视觉岗笔试题跟纯软件岗还有一个明显区别图像处理题的表达方式更“软”。它经常不给标准输入输出而是让你描述步骤或写出核心公式比如“请说明用 Sobel 算子检测边缘时为什么需要分别计算 x 方向和 y 方向的梯度”。这种题没有唯一答案但很能看出一个人是真正动手写过代码还是只背了概念。正因为如此我建议大家复习图像处理部分时不要只看书一定要亲手把算法实现一遍。后面第三章我会给出手写 Sobel、拉普拉斯、直方图均衡的核心代码和踩坑点这些都是可以直接抄作业的版本。2. 数据结构与经典算法题解析2.1 KMP的next数组手把手推一遍KMP 是校招笔试里的高频常客计算机视觉岗也不例外。字符串匹配在文档处理里很常见比如从一段 OCR 文本里找出指定关键词的位置。笔试考 KMP 通常会给一个具体模式串要求写出 next 数组。热搜里就有一道很典型的题模式串 p“abacaba”求 next 数组。这里要先说清楚一件事next 数组在不同教材里有两种定义很多同学栽就栽在这个地方。一种定义是 next[i] 表示“p[0..i] 这个子串的最长相等真前后缀长度”也就是前缀函数 pi[i]另一种定义是“当 p[i] 失配时模式串指针回退的位置”约定 next[0]-1。两种定义算出来的结果不一样答题时一定要先写明白自己用的是哪种否则过程分很容易丢。我用前缀函数版本手推一遍 p“abacaba”。Pi[0] 对单字符“a”来说没有真前后缀所以是 0。Pi[1] 对应“ab”前缀有 a后缀有 b不相等所以是 0。Pi[2] 对应“aba”真前后缀里 a 和 a 相等所以是 1。Pi[3] 对应“abac”前缀 a 和后缀 c 不匹配更长的也都不匹配所以是 0。Pi[4] 对应“abaca”前缀 a 和后缀 a 匹配是 1。Pi[5] 对应“abacab”前缀 ab 和后缀 ab 匹配是 2。Pi[6] 对应“abacaba”前缀 aba 和后缀 aba 匹配是 3。最终 pi 数组就是 [0, 0, 1, 0, 1, 2, 3]。前缀函数的计算代码建议背成模板笔试时能省很多时间。C 写法如下vectorint prefixFunction(const string p) { int m p.size(); vectorint pi(m, 0); for (int i 1; i m; i) { int j pi[i - 1]; while (j 0 p[i] ! p[j]) j pi[j - 1]; if (p[i] p[j]) j; pi[i] j; } return pi; }匹配主串时模式串指针 j 失配就回退到 pi[j-1]这个写法配合前缀函数版本很干净不容易出错int kmpMatch(const string s, const string p) { vectorint pi prefixFunction(p); for (int i 0, j 0; i (int)s.size(); i) { while (j 0 s[i] ! p[j]) j pi[j - 1]; if (s[i] p[j]) j; if (j (int)p.size()) return i - j 1; } return -1; }踩坑点有两个。第一很多实现版本在 j 回退时写的是 j next[j]但这个写法只适用于 next[0]-1 的老版本如果你用的是前缀函数回退必须是 pi[j-1]两者混用会导致死循环或漏匹配。第二用 while 回退后还要再判断一次当前字符是否相等这个顺序别写反了。我建议笔试时间充裕的话算完 next 数组后手工跑一个简单例子验证比如主串 “ababacaba” 就能快速检查回退逻辑。2.2 排序算法快排、堆排、冒泡考点对比排序算法属于“不该丢分”的题。视觉岗虽然平时不直接写排序但图像数据预处理经常涉及按面积、置信度排序比如目标检测里对候选框按分数排序然后做非极大值抑制底层就是个排序问题。笔试中常见的考法是指定用某种排序要求写完整代码或说明复杂度与稳定性。快速排序的核心思想是分治选一个基准元素把小于等于基准的放左边大于基准的放右边然后递归处理左右两半。基准选得不好会退化到 O(n^2)所以工业实现里常用“三数取中”。代码模板我建议用下面这个简洁版本int partition(vectorint a, int l, int r) { int piv a[r]; int i l; for (int j l; j r; j) { if (a[j] piv) { swap(a[i], a[j]); i; } } swap(a[i], a[r]); return i; } void quickSort(vectorint a, int l, int r) { if (l r) return; int mid partition(a, l, r); quickSort(a, l, mid - 1); quickSort(a, mid 1, r); }堆排序也建议背一遍因为“查找前 K 个最大元素”这类问题直接跟堆相关视觉里的 top-K 操作很常用。堆排序分两步先建堆再反复把堆顶元素换到末尾并调整。核心的 heapify 代码如下void heapify(vectorint a, int n, int i) { int largest i; int l 2 * i 1, r 2 * i 2; if (l n a[l] a[largest]) largest l; if (r n a[r] a[largest]) largest r; if (largest ! i) { swap(a[i], a[largest]); heapify(a, n, largest); } } void heapSort(vectorint a) { int n a.size(); for (int i n / 2 - 1; i 0; --i) heapify(a, n, i); for (int i n - 1; i 0; --i) { swap(a[0], a[i]); heapify(a, i, 0); } }笔试经常对比各种排序的性质这张表直接背下来可加快答题速度排序算法平均时间复杂度最坏时间复杂度额外空间稳定性冒泡排序O(n^2)O(n^2)O(1)稳定快速排序O(n log n)O(n^2)O(log n)不稳定堆排序O(n log n)O(n log n)O(1)不稳定归并排序O(n log n)O(n log n)O(n)稳定有同学会问为什么视觉岗位要关心稳定性。举一个例子在做文档表格结构识别时如果先按列坐标排序再按行坐标排序稳定排序能保证第二次排序后原先的列顺序不被破坏。这种细节在场景题里提一句会显得你工程经验扎实。2.3 快速幂与贪心拿到手的保分题快速幂和贪心算法是笔试卷里的“保分题”因为它们代码短、逻辑固定属于背下来就能拿分的类型。视觉岗里快速幂虽然不常用但它考察的是“二进制拆分”这种基础思维笔试方往往用它来判断候选人有没有扎实的数学底子。快速幂的核心思想是把指数 b 表示成二进制比如 x^13 x^(841)也就是 x^8 * x^4 * x^1。每轮把底数平方指数右移一位遇到二进制位为 1 就乘到结果里。模运算版本如下long long qpow(long long a, long long b, long long mod) { long long res 1 % mod; a % mod; while (b 0) { if (b 1) res res * a % mod; a a * a % mod; b 1; } return res; }注意两个细节第一模数可能等于 1所以 res 初始值要写成 1 % mod不能直接写 1第二乘法在极端情况下可能溢出 long long如果题目范围很大可以用 __int128 中转或者用快速乘。贪心算法的经典题是“选择最多不重叠区间”。思路是按结束时间排序然后贪心地选结束最早且与已选区间不冲突的区间。核心代码很短int intervalSchedule(vectorpairint,int intervals) { sort(intervals.begin(), intervals.end(), [](auto a, auto b) { return a.second b.second; }); int count 0, lastEnd INT_MIN; for (auto p : intervals) { if (p.first lastEnd) { count; lastEnd p.second; } } return count; }贪心题最重要的不是写代码而是说清楚“为什么这样贪心是对的”。上面的例子里结束时间越早给后面留下的空间越多所以按结束时间排序是最优策略。笔试简答题里能把这句话写出来分数会明显高一个档次。3. 图像处理基础算法视觉岗的“本命题”3.1 Sobel边缘检测原理、手写与边界处理到了图像处理部分这是视觉岗区分度最大的板块。Sobel 算子是最常用的边缘检测算法之一热度词里一直在高频出现笔试喜欢让你写原理、写模板甚至手写实现。Sobel 用两个 3x3 的卷积核分别计算 x 方向和 y 方向的梯度。Gx 对垂直方向边缘响应强Gy 对水平方向边缘响应强。Gx [-1 0 1; -2 0 2; -1 0 1] Gy [-1 -2 -1; 0 0 0; 1 2 1]对于每个像素取它周围 3x3 邻域和两个核做点乘分别得到 gx 和 gy梯度幅值近似为 sqrt(gx^2 gy^2)工程上为了省计算量也常用 |gx| |gy|。梯度方向是 atan2(gy, gx)在非极大值抑制环节会用到。手写实现的核心代码可以看这个 Python 版本import numpy as np def sobel(img): h, w img.shape Gx np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtypenp.float64) Gy np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtypenp.float64) out np.zeros((h - 2, w - 2), dtypenp.float64) for i in range(1, h - 1): for j in range(1, w - 1): patch img[i-1:i2, j-1:j2].astype(np.float64) gx (patch * Gx).sum() gy (patch * Gy).sum() out[i-1, j-1] np.sqrt(gx * gx gy * gy) return out这里最容易踩的坑就是边界处理。卷积核是 3x3图像的边缘像素没有完整邻域所以在上面这个实现里输出尺寸比原图小 2。工程上更常见的做法是用零填充或复制填充让输出跟原图一样大。答题时能主动说明“边缘像素用复制填充避免边缘信息丢失”是个很好的加分点。得到梯度幅值后还要做阈值化把大于阈值的像素设为 255小于设为 0才能得到二值边缘图。阈值设得太低会把噪声也算成边缘太高则会把真正的轮廓断掉。实际笔试如果只让你写核心算法不要求完整做非极大值抑制和双阈值但要能说出 Canny 是在 Sobel 基础上加了这两步这样显得你对整个边缘检测流程有整体认识。3.2 拉普拉斯算子与图像锐化拉普拉斯算子是二阶微分算子跟 Sobel 的一阶梯度不同它直接对图像求二阶导用来检测灰度突变。四邻域模板是 [0 1 0; 1 -4 1; 0 1 0]八邻域模板是 [1 1 1; 1 -8 1; 1 1 1]八邻域版因为考虑了对角线响应更强。拉普拉斯在笔试里的常见考法有两个。一个是让写模板并解释为什么能检测边缘平坦区域二阶导接近 0边缘处二阶导会产生正负交替的响应。另一个是图像锐化公式g f - c * nabla^2 f模板中心为负时实际效果是把边缘反差拉大视觉上更“清晰”。锐化的工程坑在于拉普拉斯对噪声非常敏感因为二阶导会放大高频噪声。所以工业界的锐化流程通常是先高斯平滑再去算拉普拉斯这就是高斯拉普拉斯算子 LoG 的来历。笔试里如果题目问“图像有噪声时能不能直接拉普拉斯锐化”标准答法是先降噪再锐化或者用 LoG 代替。3.3 直方图均衡化的完整流程直方图均衡化是图像增强的经典算法在办公文档增强里非常实用。拍出来的文档照片如果偏暗、对比度低均衡化能把灰度分布拉开让文字和背景的边界更清楚。算法流程分四步。第一步统计每个灰度级出现的次数得到直方图 h(k)。第二步把频数转换成概率 p(k) h(k) / NN 是像素总数。第三步计算累计分布函数 cdf(k) sum(p(0) 到 p(k))。第四步映射新灰度 out(k) round(cdf(k) * (L-1))L 是灰度级数通常是 256。Python 实现很短也可以直接用 OpenCV 的 equalizeHist但笔试如果让手写你需要展示计算过程import numpy as np def hist_equalize(img): h, w img.shape hist np.bincount(img.ravel(), minlength256).astype(np.float64) pdf hist / (h * w) cdf np.cumsum(pdf) lut np.round(cdf * 255).astype(np.uint8) return lut[img]均衡化的问题在于它是全局变换如果图像一部分很亮、一部分很暗全局均衡效果就一般。所以在处理光照不均的文档时我更推荐自适应直方图均衡比如 CLAHE它把图像分成若干小块每块单独做均衡再用插值消除块间边界。笔试场景题里说“光照不均匀时用 CLAHE 而不是全局直方图均衡”这句话能体现出你踩过真实数据的坑。3.4 图像缩放与插值重采样原理图像缩放是重采样问题跟热搜里“音频重采样算法”是同一类数学问题只是应用维度不同。缩放的本质是从原图像素网格映射到目标像素网格目标的每个像素要取原图上哪个位置的值取决于缩放比例。最近邻插值最简单直接取最近的像素值速度快但会出现锯齿。双线性插值是视觉任务里最常用的折中方案它对目标位置周围的 4 个像素做两次线性插值横向一次、纵向一次。假设目标位置映射到原图坐标 (x, y)取周围 (x1, y1), (x2, y1), (x1, y2), (x2, y2)先插出两个横向中间值再插出最终值。公式可以简洁表达为f(x,y) (1 - t)(1 - u) f(x1,y1) t(1-u) f(x2,y1) (1-t) u f(x1,y2) t u f(x2,y2)其中 t 和 u 是偏移量的小数部分。双三次插值用更多邻域像素和三次多项式逼近质量更好但计算量大在图像缩放质量要求高的场景比如打印排版会优先用。笔试如果问你“缩放图像时用什么插值”双线性是最稳的答法。另一个容易丢分的细节是坐标对齐。做图像缩放时“虚拟”像素坐标落在原图的网格上OpenCV 里用 align_corners 参数控制是否把中心对齐。深度学习里的上采样层比如反卷积和 resize 操作也经常讨论 align_corners 对特征对齐的影响。笔试只要答到“缩放是重采样需要插值”这个层面已经很完整能延伸到深度学习上采样更好。4. 机器学习、深度学习与视觉场景题4.1 KNN、聚类与特征空间基础机器学习部分的题通常不要求手推复杂公式但要求你能清楚地解释常见算法和适用场景。热点词里 KNN 被反复提到网上还有“KNN 算法的应用能力包括哪三个方面”这种经典题其实就是 K 值选择、距离度量、分类决策规则三要素。KNN 的思路是新样本的类别由它特征空间里最近的 K 个样本投票决定。K 取值小模型复杂容易过拟合K 取值大模型平滑但可能欠拟合。距离度量常用欧氏距离也可以用曼哈顿距离或余弦相似度。关键问题是特征必须归一化否则量纲大的特征会主导距离计算比如人物身高 180 和像素值 200 放在一起身高数值天然占优分类效果就偏了。聚类算法中 K-Means 是笔试常客。流程是随机选 K 个中心每个样本归到最近中心更新中心为簇内均值重复迭代直到收敛。它的短板很经典K 要预先指定、对初始中心敏感、欧氏距离对特征尺度敏感。在视觉里 K-Means 常被用于颜色量化、无监督分割比如把一张图片压缩成 K 种主要颜色这种题答出 K-Means 就能得分。4.2 卡尔曼滤波目标跟踪里的预测与修正卡尔曼滤波在视觉岗位笔试里属于“会了很加分不会也不致命”的题目但如果岗位方向是目标跟踪或视频分析它出现的概率很高。卡尔曼滤波解决的核心问题是系统有噪声观测也有噪声如何把两个不完美的信息来源融合起来得到对状态更准确的估计。它的思想可以概括成两步循环。预测步根据上一时刻的状态用状态转移模型预测当前时刻的状态和误差协方差。更新步拿到当前观测值后计算卡尔曼增益 K增益大小决定了我们更相信预测还是更相信观测。如果观测噪声小K 偏大更信任观测如果状态预测噪声小K 偏小更信任预测。预测步的公式是 x_pred A x_prev B uP_pred A P_prev A^T Q。更新步的增益是 K P_pred H^T (H P_pred H^T R)^{-1}状态修正为 x_new x_pred K(z - H x_pred)协方差更新为 P_new (I - K H) P_pred。笔试不一定要你默写全套公式但最好能解释 Q 和 R 的含义以及为什么卡尔曼增益在观测噪声大时变小。在视觉目标跟踪里卡尔曼滤波常用来预测检测框的运动轨迹当某一帧检测器漏检时可以用预测结果补上。这个场景答出来面试官会觉得你知道怎么把理论嫁接到实际业务里。4.3 图像分类与目标检测的通用考点深度学习部分在笔试里一般不会让你从零推 Backpropagation但会问基础概念和模型差异。图像分类的基础考点包括卷积层的作用、池化层的作用、感受野、交叉熵损失。卷积层是“局部加权求和加非线性激活”用共享权重降低参数量池化做下采样增大感受野并提供少量平移不变性。感受野是输出像素对应输入图像的区域大小网络越深感受野越大。目标检测是视觉岗位的热门方向笔试常问“两阶段和单阶段检测器的区别”。两阶段代表是 Faster R-CNN 系列先生成候选区域再对每个候选框分类和回归精度高但速度慢单阶段代表是 YOLO 和 SSD直接在特征图上回归边界框和类别速度快但小目标检测效果通常弱一些。回答时把“精度 vs 速度”这个 trade-off 说清楚逻辑就很完整。另一个高频概念是 anchor也就是预定义的参考框。检测器以 anchor 为基准预测相对 anchor 的偏移量。你在答场景题时如果能把 anchor 和 NMS 顺带提出来会大大加分。4.4 办公场景落地题文档扫描与OCR预处理场景设计题是视觉岗笔试卷里最能拉开档次的部分金山办公这类做文档的公司的考题尤其会往这个方向出。典型的题目大概是手机拍一张纸面文档光线不均、有倾斜和阴影请设计一套图像预处理流程让它适合 OCR 识别。我的建议答案是按下面这个链路走每一步都要说清目的。第一步灰度化并做高斯滤波目的是去噪为后续边缘检测做准备。第二步用 Sobel 或 Canny 找文档边缘再通过轮廓检测找到文档四个顶点。第三步根据四个顶点做透视变换把倾斜的文档矫正成矩形这一步对应 OpenCV 里的 getPerspectiveTransform 加 warpPerspective。第四步用自适应阈值或 CLAHE 增强解决光照不均。第五步如果有倾斜残留用霍夫变换检测文本行做旋转校正。最后再交给 OCR 引擎。这套流程的每步都有对应考点我做了个简单表格方便你记忆预处理步骤使用的算法解决什么问题灰度化加权平均灰度减少计算量去噪高斯滤波抑制传感器噪声边缘检测Sobel / Canny找文档边界几何矫正透视变换消除拍摄视角倾斜对比度增强CLAHE / 自适应阈值处理光照不均文字增强二值化分离文字和背景这种题不要求完整代码但要求你能把链路讲顺并且知道每个算法为什么放在那个位置。比如去噪必须在边缘检测之前因为噪声会直接干扰边缘响应自适应阈值必须在透视变换之后因为透视变换会重新采样像素先做阈值会让插值产生锯齿。能把这种先后关系讲明白的人才是真的亲手做过文档图像处理。5. 工程实现与编程题实战5.1 二维矩阵原地旋转90度编程题部分视觉岗常考矩阵和数组操作因为图像本质上就是个二维矩阵。经典题是给定 n x n 矩阵要求顺时针旋转 90 度额外空间限制 O(1)。我第一次写这题时直接开了一个新矩阵存放结果其实不符合空间要求。原地旋转的思路是先转置再逐行反转。转置是把 matrix[i][j] 和 matrix[j][i] 交换逆时针旋转则是转置后逐列反转。代码写起来很干净void rotate(vectorvectorint matrix) { int n matrix.size(); for (int i 0; i n; i) for (int j i 1; j n; j) swap(matrix[i][j], matrix[j][i]); for (int i 0; i n; i) reverse(matrix[i].begin(), matrix[i].end()); }注意两个细节。第一内层循环从 j i1 开始如果从 i 开始会同一个元素交换两次等于没交换。第二边界条件要处理 n0 和 n1 的情况虽然代码逻辑上自动正确但笔试时最好明确说出来显得你考虑过边界。5.2 最大子数组和动态规划的经典形态最大子数组和是动态规划里最基础的一道题也用贪心思维。题目是给一个整数数组找一个连续子数组使它的和最大。经典解法是 Kadane 算法维护两个变量当前连续子数组和 cur以及全局最大和 best。递推逻辑是cur 记录以当前元素结尾的最大子数组和如果 cur x x说明之前的和是负贡献不如从当前元素重新开始所以 cur max(x, cur x)。同时用 best 保存历史最大值。int maxSubArray(vectorint nums) { int cur 0, best nums[0]; for (int x : nums) { cur max(x, cur x); best max(best, cur); } return best; }坑点是数组全为负数时cur 初始化为 0 会导致答案是 0 而不是最大负数。所以 best 要初始化为 nums[0]或者 cur 也初始化为 nums[0] 再直接从第二个元素遍历。这道题在视觉里的变体是找图像 ROI 区域最大连通亮度核心思想一样。5.3 复杂度与边界条件从“能跑”到“能过”编程题能不能过很多时候不是算法思路的问题而是复杂度和边界条件的问题。笔试平台通常限制 1 秒数据规模 n 如果到 10^5O(n^2) 的暴力算法很可能超时需要 O(n log n) 甚至 O(n) 的方案。拿到题目后第一件事不是写代码而是看数据范围这决定了你能用什么算法。另一个容易被扣分的地方是边界条件。数组空、只有一个元素、所有值相等、输入含负数这些情况必须在自己脑子里模拟一遍。我见过很多同学算法思路完全正确但因为没判断空数组运行直接崩溃一道题零分。笔试时宁可多写几行防御性判断也不要赌测试数据里没有边界情况。5.4 语言选型与答题规范视觉岗笔试的语言选型我的建议是 C 或 Python 都可以但要看岗位 JD 的偏向。偏服务端和部署的岗位通常建议 C因为很多图像算法库底层就是 C偏算法实验和模型的岗位用 Python 更顺手。不管选哪个都要注意代码规范变量命名别用 a、b、c 这种含义不明的关键步骤写一行注释说明思路。还有一个答题技巧是先搭框架再填细节。比如写排序题先写出函数签名和主流程再实现 partition 或者 heapify这样即使细节没写完阅卷人也能看到你的整体思路。千万不要一上来就埋头写写到最后发现逻辑卡住时间就浪费了。6. 常见问题与排查技巧实录6.1 笔试常见失误速查表这些年看下来视觉岗笔试失误集中在几个固定位置。我在下面整理成速查表相当于是踩坑经验集合失误类型具体表现排查与规避方法KMP定义混淆next数组两种定义混用匹配时异常明确写“前缀函数pi[i]”匹配回退用pi[j-1]Sobel边界处理遗漏结果图像尺寸变小或边缘黑边用复制填充或零填充并在注释里说明图像类型错误整型图像直接卷积结果截断为0转成 float 再计算最后再转回 uint8直方图均衡忘记归一化映射公式直接除总像素类型错误先算 pdf再算 cdf再乘灰度级编程题漏边界空数组、单元素数组直接崩溃提交前手动跑三组数据空、1个、全负数复杂度超标10^5 规模写了双重循环先看数据范围再套用 O(n log n) 以下算法场景题步骤乱先二值化再透视变换导致矫正失败记住链路过几何对齐必须放在重采样前6.2 时间分配与做题顺序校招笔试的时间很紧张我建议按“先保分、再攻坚”的顺序做题。开考前先把整张卷子扫一遍把简答题里确定会做的先答再写编程题最后再去啃完全没思路的难题。图像处理和数据结构的选择题通常不难先拿稳编程题的代码量比较大需要预留足够时间调试场景题放在编程题之后因为它的开放性强写多写少都能拿一部分分。如果一张卷子是一个半小时我的分配习惯是选择题和填空题 25 分钟基础简答题 20 分钟编程题 35 分钟场景题 25 分钟留 5 分钟检查。当然每个人情况不同但核心原则是不在同一道题上死磕超过 10 分钟。笔试不是每道题都要满分总分过线就行。6.3 考前一月的复习建议最后一个环节给准备考这类岗位的同学一些可落地的复习建议都是我实际带人时验证过的。第一LeetCode 刷高频的前 150 题重点是数组、字符串、链表、树、动态规划和贪心不用追求难题但简单和中等的题必须做到闭眼能写。第二图像处理算法每一类都手写一遍Sobel、高斯滤波、直方图均衡、双线性插值、透视变换这五个是最常见的不能只看不写。第三把经典深度模型的脉络理一遍不要只看结构图最好能默写出卷积和全连接的维度变化。第四考前做两次完整限时模拟用一套往年的题或者自拟的题严格按真实时间执行这样考试时对时间节奏会有感觉。另外提醒一句简历里写过的每一个项目都要准备好