科大讯飞算法岗笔试复盘:从KMP到机器学习的备考攻略

发布时间:2026/9/1 5:40:46
科大讯飞算法岗笔试复盘:从KMP到机器学习的备考攻略 2024年秋招我投了科大讯飞的算法岗。说实话在收到笔试邮件之前我对这家公司的算法笔试内容是完全没底的。网上关于讯飞算法岗笔试的信息很零散有的说考得很基础有的说偏语音信号处理越看越心虚。等到真正做完笔试、复盘完题目之后我的感受是科大讯飞的算法岗笔试考察范围比想象中广但核心逻辑非常清晰——不是死记硬背题库而是考察你作为算法工程师的基本盘数据结构和算法功底、机器学习/深度学习基础、以及把理论落地到具体业务场景的能力。这篇文章就把我这次笔试的完整经历、考点复盘、以及备考中的经验教训一次性整理出来。1. 笔试前夜先搞清楚科大讯飞算法岗在筛什么样的人在聊具体题目之前我想先花点篇幅说说备考的底层逻辑。很多同学拿到笔试通知就开始盲目刷题但我觉得更有效的方式是先搞清楚这场笔试的目标它到底想筛选出什么样的候选人1.1 从JD反推考点布局科大讯飞的算法岗JD里经常出现这些关键词扎实的编程基础、熟悉常用数据结构和算法、掌握机器学习与深度学习基础理论、有语音/图像/NLP等相关项目经验优先。把这些要求翻译成笔试考点基本就是三块第一块是计算机基础数据结构、算法设计、复杂度分析这些东西任何一家公司的算法岗笔试都跑不掉。第二块是机器学习/深度学习理论不会像面试问得那么深但基础概念、经典模型的原理和适用场景要清楚。第三块是与业务方向相关的专业知识比如语音信号处理、音频算法、图像处理这类基础概念。讯飞在智能汽车、教育、医疗、智慧城市都有布局所以笔试里夹杂一些信号处理、控制类的常识题一点也不奇怪。我这次笔试的总体感受是选择题部分覆盖面很广数据结构、算法、机器学习、深度学习、数学基础甚至还有一些工程相关的常识题。编程题部分偏向经典算法题目难度适中偏上没有特别偏门的竞赛题但如果基本功不扎实容易在细节上翻车。1.2 题型构成与时间分配策略以我这次收到的笔试为例总时长120分钟题型大致如下题型题量分值占比建议时间单选题15题30%25分钟多选题5题10%10分钟编程题3题35%70分钟简答题2题25%15分钟这个时间分配是我实际做题后得出的最优方案。我当时的策略是先快速过选择题把不确定的标记出来不要恋战然后全力做编程题编程题分值高、区分度大必须保证足够的思考时间简答题放在最后因为简答题踩分点比较明确只要写出了关键点就能拿分不像编程题要么AC要么0分。如果你拿到的是其他题量组合记住核心原则编程题永远最优先。原因很简单编程题是全自动判分AC就是AC没AC就是没分没有中间状态。而选择题哪怕不会也有概率蒙对。把时间优先分配给确定性最高的题目才是性价比最高的策略。2. 高频编程题考点拆解KMP、排序与图论是重头戏编程题是算法岗笔试的核心。科大讯飞的编程题和大多数互联网公司风格类似集中在字符串处理、排序、图论、动态规划、贪心这些经典算法上。但今年的题目里明显能感觉到对“基础算法原理理解深度”的强调很多题不是单纯套模板而是考察你有没有真正理解算法背后的逻辑。2.1 KMP算法的next数组到底怎么算我之前刷真题回忆帖的时候看到很多人提到科大讯飞考过KMP算法的next数组计算。果然这次笔试的选择题里就有一道给定模式串 p abacaba求其 next 数组。很多人看到KMP就头大其实只要抓住核心思想next数组记录的是当模式串中某个位置匹配失败时模式串应该回退到哪个位置继续匹配。换句话说next[i]表示的是 p[0:i] 这个前缀中最长的相同前后缀长度有的定义版本是去掉当前字符后的最长相同前后缀具体看题目定义。我用 p abacaba 手动算一遍帮助大家理解i 0规定 next[0] -1有的教材是0入口处看题目定义i 1子串 a没有相同前后缀next[1] 0i 2子串 ab没有相同前后缀next[2] 0i 3子串 aba前缀 a 和后缀 a 相同长度为1next[3] 1i 4子串 abac没有相同前后缀next[4] 0i 5子串 abaca前缀 a 和后缀 a 相同长度为1next[5] 1i 6子串 abacab前缀 ab 和后缀 ab 相同长度2next[6] 2所以 next 数组为[-1, 0, 0, 1, 0, 1, 2]这是next[0]-1的定义版本。如果题目采用 next[0]0 的定义那就是 [0, 0, 0, 1, 0, 1, 2]。两种定义都出现过做题前一定要先看题目里给出的公式或示例。我在实际笔试中养成了一个习惯用笔在草稿纸上老老实实写出每个前缀的公共前后缀长度不跳步。这个习惯帮我避免了很多低级错误。def get_next(p): n len(p) next [-1] * n i, j 0, -1 while i n - 1: if j -1 or p[i] p[j]: i 1 j 1 next[i] j else: j next[j] return next笔试里考KMP除了让手算next数组还可能让你分析时间复杂度。KMP匹配过程的时间复杂度是 O(mn)m是主串长度n是模式串长度。这个结论要背牢选择题常考。2.2 排序算法全家桶复杂度、稳定性与手撕场景排序算法在今年的笔试中出现频率非常高。选择题考复杂度、稳定性、适用场景编程题也常考基于排序变形的问题比如求第K大、求中位数、合并区间。我把常考的排序算法整理成了一张表排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n²)O(1)稳定插入排序O(n²)O(n²)O(1)稳定选择排序O(n²)O(n²)O(1)不稳定快速排序O(n log n)O(n²)O(log n)不稳定归并排序O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(1)不稳定这张表几乎是必背内容。但光背表不够我在笔试里实际遇到的是换了个马甲的考法比如“以下哪个排序算法在数据基本有序时效率最高”答案是插入排序因为基本有序时插入排序可以接近 O(n)。这种题靠理解不靠背。编程题里需要手写排序的时候快速排序和归并排序是最常被要求手撕的两个算法。快排要注意的是若基准值选得不好最坏会退化成 O(n²)。我一般写快排时直接取中间位置的元素作为 pivot这在绝大多数情况下都能避免最坏情况。归并排序需要注意的就是临时数组的开辟与拷贝写的时候要小心数组下标的边界。有些人会觉得笔试语言自带sort函数为什么还要手写排序因为有些题会限制你只能使用 O(1) 辅助空间或者要求基于排序的思想做变形处理比如求逆序对数量就必须用归并排序的思路。这些时候只会调sort的人就直接卡住了。2.3 图论与贪心Dijkstra、Kahn与经典贪心模型图论算法也是科大讯飞笔试的常客。今年虽然没有出特别复杂的大题但在选择题和编程题中都有涉及。Dijkstra算法是单源最短路径的经典算法核心思想是贪心每次从未确定最短路的节点中选出距离最小的节点然后用它去松弛相邻节点。笔试中如果考到通常会让你写出时间复杂度。朴素版的Dijkstra是 O(V²)使用优先队列优化后可以降到 O((VE) log V)。我建议优先掌握堆优化的写法因为在笔试中更通用。import heapq def dijkstra(graph, start, n): 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]: if dist[u] w dist[v]: dist[v] dist[u] w heapq.heappush(pq, (dist[v], v)) return distKahn算法是拓扑排序的一种实现方式核心是不断删除入度为0的节点。这个算法在判断有向图是否有环时非常实用。我复习的时候把Kahn算法和深度优先遍历判断环两种方法都整理成了模板笔试遇到就直接套。贪心算法方面常见的模型有区间调度、哈夫曼编码、活动选择问题等。这类题的关键是证明贪心策略的正确性笔试不要求严格证明但你得能说出贪心选择的理由比如“每次选结束时间最早的可以给后面的活动留出最大空间”。如果你在简答题里能写出这样的推理过程得分会明显高于只写代码的答案。2.4 其他高频算法快速幂、二分、动态规划除了上面几类还有几个算法几乎每年都会出现快速幂是解决大数取模问题的利器核心思想是把指数拆成二进制通过倍增来减少乘法次数。时间复杂度 O(log n)。我在笔试中遇到的一道编程题就是计算 a 的 n 次方对 M 取模n 可以高达10的18次方。如果没用快速幂直接循环肯定会超时。def fast_pow(a, n, mod): res 1 while n 0: if n 1: res res * a % mod a a * a % mod n 1 return res二分查找是我个人认为性价比最高的算法代码量少但边界条件极易出错。很多同学在 left 和 right 的更新条件上翻车。我分享一个比较稳妥的写法查找第一个大于等于 target 的位置使用左闭右开的区间。def lower_bound(nums, target): left, right 0, len(nums) while left right: mid (left right) // 2 if nums[mid] target: right mid else: left mid 1 return left动态规划是编程题里区分度最大的考点。科大讯飞笔试的DP题通常不会太难大多集中在背包问题、最长公共子序列、最长递增子序列、编辑距离这几个经典模型。复习的时候我建议把每个经典DP模型的状态定义、转移方程、初始化条件、遍历顺序都整理清楚这样遇到变形题才能快速迁移。3. 机器学习与深度学习笔试从公式推导到场景应用科大讯飞作为一家人工智能公司算法岗笔试必然包含机器学习和深度学习的内容。这部分题目的特点是不求深度但求广度。你需要对经典算法有基本概念同时了解一些前沿方向的名词和思路。3.1 经典算法原理KNN、K-Means、XGBoost与BM25选择题里经常出现的机器学习概念包括KNN是一种基于实例的学习方法核心思路是“物以类聚”一个新样本的类别由它最近的K个邻居投票决定。KNN的三大要素是距离度量、K值选择和分类决策规则。笔试里常考的是K值过大会导致模型过于简单欠拟合K值过小则容易受到噪声干扰过拟合。K-Means聚类是典型的无监督学习算法。它的目标是把样本划分成K个簇使簇内平方和最小。笔试常考的坑有初始质心的选择会影响最终结果、K值需要人为指定、对离群点敏感。有时候会结合粒子群算法提问比如“用粒子群算法优化K-Means的初始质心选择”这时候你只要知道粒子群算法是一种群体智能优化算法通过粒子迭代更新寻找最优解就够了。XGBoost是机器学习笔试的高频考点。它的核心思想是梯度提升Gradient Boosting通过不断训练决策树来拟合前面模型的负梯度。和GBDT相比XGBoost加入了对叶子节点的L2正则化、列的采样、以及对目标函数的二阶泰勒展开。面试中如果连XGBoost的基本原理都说不清楚会比较减分。BM25在信息检索领域用得比较多它是一种基于词频和逆文档频率的打分函数常用于搜索引擎和文本相关性排序。科大讯飞有智能语音和文本处理业务所以像BM25这种文本算法出现在选择题中完全在意料之中。复习时不需要掌握太深的数学推导但要清楚它是如何权衡词频与词汇稀有度的。3.2 深度学习基础图像分类、拉普拉斯算子与EVA-02深度学习部分的考题主要考察基础概念和常见模型结构。图像分类是深度学习最经典的任务之一。选择题可能会问常见的图像分类模型有哪些你需要知道 AlexNet、VGG、ResNet、EfficientNet 等经典网络的特征。尤其是 ResNet 的残差连接Residual Connection解决了深层网络梯度消失的问题这是一个高频考点。图像处理基础算法也值得花点时间复习比如拉普拉斯算子和Sobel算子都是图像锐化和边缘检测的常用工具。Sobel算子通过计算图像的一阶导数来检测边缘拉普拉斯算子是二阶导数算子对噪声更敏感所以实际使用中通常先做高斯平滑再去计算拉普拉斯响应。这类题不会考得太深能说出算子的用途和基本差异就够了。EVA-02这类前沿模型名词也可能出现在选择题中作为“以下哪个是图像分类模型”这种选项出现。对于这种题不需要了解模型细节但至少要知道它是视觉Transformer方向的一个模型。平时多浏览一下技术资讯混个眼熟考试时就有优势。3.3 优化算法与信号处理常识粒子群、卡尔曼滤波与PID我做完选择题后发现科大讯飞笔试里有一部分题目和“信号处理、控制、硬件”有关。这背后是有原因的讯飞在智能汽车、智能硬件领域有大量业务布局算法工程师如果完全不懂信号处理是没法跟嵌入式团队协作的。粒子群算法是群体智能优化算法模拟鸟群觅食行为。每个粒子有位置和速度两个属性迭代过程中每个粒子根据个体最优和群体最优更新自己的速度与位置。笔试中可能会根据这类题出现的原因出选择题。你需要记住的是粒子群算法的核心是“个体认知 社会认知”即每个粒子既向自己历史最优位置学习也向全局最优位置学习。卡尔曼滤波是经典的最优状态估计算法广泛应用于自动驾驶、机器人导航、语音增强等场景。核心思想是“预测 更新”两步骤先根据系统模型预测当前状态再用观测值更新估计。公式不要求背但要知道它的输出是一个带不确定性的状态估计且计算是递归进行的不依赖历史全部数据。PID算法是最经典的控制算法笔试中直接以“PID在CRPS PSU Power中的作用”这种形式出现。PID分别对应比例Proportional、积分Integral、微分Derivative三个环节比例项消除当前误差积分项消除稳态误差微分项抑制超调。在电源控制中PID用来调节电压或电流使输出稳定在目标值附近。如果你在简历里写了嵌入式相关项目这类常识题基本是必考的。4. 编程题实战从审题到AC的完整链路说了这么多考点分布下面用一道类似的题目演示一下我在笔试现场的完整解题思路。假设题目是这样的不完全是原题但题型高度还原题目描述给定一个包含 n 个整数的数组 nums找出数组中所有和为 0 且不重复的三元组 [a, b, c]。要求时间复杂度不超过 O(n²)。4.1 审题与算法选型看到“和为0的三元组”第一反应是暴力三重循环但 n 的范围如果到 3000 以上O(n³) 必然超时。所以需要优化。常见的解法是“排序 双指针”先将数组升序排序排序的作用是消除重复解和方便双指针移动固定第一个数 nums[i]那么问题就转化为在剩余数组中找两数之和等于 -nums[i]在 i1 到 n-1 的范围内使用双指针 left 和 right通过移动指针找出所有满足条件的组合这里有个关键点去重。排序后如果 nums[i] 和前一个数相同就跳过双指针内部如果找到满足条件的组合也要跳过所有重复的数字。4.2 边界条件与代码实现写代码的时候边界条件非常重要。我当时在草稿纸上先列了几条边界情况数组为空或长度小于3直接返回空列表排序后第一个元素大于0说明后面全部大于0不可能有三元组和为0直接结束双指针移动过程中left 必须小于 right否则越界def three_sum(nums): nums.sort() n len(nums) res [] for i in range(n - 2): if i 0 and nums[i] nums[i - 1]: continue if nums[i] 0: break left, right i 1, n - 1 while left right: total nums[i] nums[left] nums[right] if total 0: left 1 elif total 0: right - 1 else: res.append([nums[i], nums[left], nums[right]]) while left right and nums[left] nums[left 1]: left 1 while left right and nums[right] nums[right - 1]: right - 1 left 1 right - 1 return res写完代码之后我用题目给的示例数据跑了一遍然后自己构造了几个边界用例全是0的数组、只有一个元素、有多个重复元素。自己的用例跑通之后再点击提交AC的概率就高很多。这个方法建议大家都养成习惯笔试环境没有IDE断点调试只有提交前的自测自测越充分提交失败的心理压力就越小。4.3 编程题细节输入输出与语言选型笔试环境一般使用牛客或者赛码系统输入输出格式必须提前熟悉。如果平时的刷题环境是LeetCode只写函数到了笔试需要处理标准输入容易在 IO 上浪费大量时间。我建议考前至少做3道牛客风格的题目熟悉input()、sys.stdin.read()这种读取方式。语言选型上我用Python写算法题原因很现实Python代码量最少出bug概率低笔试时间紧张时足够高效。但如果你目标是C也完全可以只是要注意使用ios::sync_with_stdio(false)提速以及用long long防止溢出。选自己最熟的语言而不是最炫的语言这是笔试的铁律。另外我在实际的笔试中还养成了提前准备模板的习惯。进考场前快速浏览一遍自己准备的模板代码快速幂、二分查找、Dijkstra、并查集、拓扑排序、常见DP模型。笔试刚开始时大脑还处于热身状态如果第一题就是熟面孔直接把模板默写出来能快速进入状态。5. 我的踩坑记录与复盘建议最后这部分我想写一些只有真正参加了笔试才会知道的细节。这些东西在网上攻略里很少看到但实际影响很大。5.1 我在笔试中踩过的坑第一个坑是选择题时间失控。我一开始做选择题时遇到几道拿不准的题就反复纠结试图通过推理推出来。结果花了将近40分钟多选题还剩下不少。等到做编程题的时候时间只剩一半心理压力骤增第一道编程题想了很久才动笔。教训是要学会放弃。选择题拿不准的题目标记一下果断跳过。笔试的目标不是满分而是总分最大化。第二个坑是没有仔细阅读题目中的示例和边界条件。有一道编程题题目描述里的输入范围写在末尾我一眼扫过去以为是10的5次方就按 O(n log n) 写了。后来仔细看才发现是10的18次方必须用 O(log n) 的算法。如果当时不回头检查题目范围这道题就直接超时了。题目里的数据范围就是你选择算法的指南针花10秒钟看清楚能省下30分钟的返工时间。第三个坑是简答题没有分点作答。简答题的判卷是按得分点给分的你写得密密麻麻一团阅卷人很难快速找到你的结论。后来我调整了策略第一行写结论第二行开始给出推导或理由有公式的写公式有计算过程的写计算过程。这样阅卷人一眼就能看到踩分点。5.2 复习顺序的复盘建议如果你还有时间准备我建议按下述顺序复习第一阶段数据结构与算法基础约60%时间。重点是排序、二分、链表、树、图论、DP。这一部分决定了你编程题的得分下限。先把必背模板整理成自己的材料然后做真题练习。第二阶段机器学习与深度学习理论约30%时间。重点是经典算法的原理、损失函数、评价指标、过拟合方法。可以用面试题集来复习但要理解背后的数学原理单纯背题答案在笔试中很容易被换考法问倒。第三阶段针对讯飞业务的常识准备约10%时间。了解一下语音信号处理、音频重采样、图像处理基础、控制算法这些跨学科常识。面试官不会期待你精通但如果你连卡尔曼滤波是干什么的都不知道在讯飞这种强AI公司就显得知识面太窄了。5.3 笔试之后的思考算法岗笔试到底在考什么走出笔试考场后我把题目复盘了一遍越来越觉得科大讯飞的算法岗笔试与其说是在考你刷了多少题不如说是在考察三个维度编程基本功、理论理解深度、知识迁移能力。第一维度是“能不能把代码写对”。很多同学看题都会但一到手写就各种边界问题这只能说明练得不够。第二维度是“知不知道原理”。KMP为什么是 O(mn)Dijkstra为什么不能处理负权边这些都是选择题喜欢问的。如果你只是背了代码而不理解原理换个角度问你你就懵了。第三维度是“能不能迁移到业务”。讯飞的业务横跨语音、图像、教育、汽车笔试题里刻意加入了一些交叉领域的内容就是在试探你的知识广度。我在笔试过程中遇到的不少题目都和网上流传的真题有较高的相似度。这提醒我即使每年题目都变但考点范围相对稳定。所以后面准备笔试的同学建议多搜集近两年的真题回忆帖把选择题中涉及的知识点全部整理成复习清单这会比漫无目的地刷题高效得多。如果这篇文章能帮你少走一点弯路那也算值了。最后再分享一个小技巧笔试前几天不要再去钻特别难的偏题怪题老老实实把常用模板默写两遍把经典算法的时间复杂度和稳定性复习一遍把机器学习的经典模型过一遍比啥都管用。上了考场你会发现稳住基本盘就是最大的赢家。