数据来源:真实面经整理 | 版本:final
一、公司画像 & 校招节奏
科大讯飞成立于,总部合肥,A股上市(股票代码:002230),市值约700亿。核心产品线覆盖讯飞输入法、讯飞听见(语音转写)、讯飞翻译机、星火认知大模型,以及AI教育产品(讯飞AI学习机)。营收约196亿元,员工超2万人。
讯飞的技术身份非常明确:全球语音识别技术的领先企业。语音识别准确率在国内外权威测评中长期位居前列,这也决定了讯飞面试的独特气质——你不能只会刷题,还得懂AI。
近年来讯飞大力投入大语言模型赛道,"星火LLM"于上线,是国内最早入场的大模型之一。AI+教育、AI+医疗是两条核心商业赛道。对想做真正AI产品的同学来说,讯飞是国内难得的选择。
一个需要提前想清楚的问题:讯飞总部在合肥,主要研发力量也在合肥。北京、上海、深圳都有分部,但体量远小于合肥基地。合肥生活成本低,技术氛围好,但对于坚持要去一线城市的同学,讯飞可能不是最优选。提前想清楚,比面完Offer才纠结要好得多。
主要招聘方向:
| 方向 | 代表业务 | 技术侧重 |
|---|---|---|
| AI算法工程师 | 语音识别、大语言模型 | Python/C++,深度学习 |
| 后端开发(Java/C++) | 讯飞开放平台、教育系统 | Java/C++,微服务架构 |
| 数据开发 | AI训练数据、数据标注 | Python/SQL,数据工程 |
| 前端/移动端 | 讯飞App、讯飞AI学习机 | React/Android/iOS |
| 测试开发 | AI产品质量保障 | Python自动化,AI测试 |
校招节奏(参考):
| 阶段 | 时间 | 行动建议 |
|---|---|---|
| 暑期实习通道 | 提前投递,实习表现好可优先转正 | |
| 正式网申 | campus.iflytek.com,简历突出AI/ML项目经历 | |
| 笔试 | 编程题2-3道 + AI基础知识选择题(算法岗) | |
| 技术面试 | 2-3轮技术面 + 1轮HR面 | |
| Offer发放 | 留意邮件,AI岗薪资可对标互联网中上水平 |
笔试特点说明:算法工程师笔试有AI专项,可能出现神经网络计算题、概率统计题,不是纯LeetCode考试。后端岗和数据开发岗笔试更接近传统互联网风格,编程题+数据库题。
二、岗位 JD 解析:技术要求拆解
讯飞招聘的技术岗位差异很大,AI算法工程师和后端开发工程师的备考路径几乎不重叠。先确认投哪个方向,再针对性准备。
AI算法工程师(讯飞最核心岗位)
| 能力维度 | JD要求 | 真实考察重心 | 备考权重 |
|---|---|---|---|
| 深度学习理论 | 熟悉神经网络 | 反向传播原理、梯度消失、BatchNorm,每轮必问 | ⭐⭐⭐⭐⭐ |
| Transformer架构 | 了解NLP/语音模型 | Self-Attention公式手推、Multi-head原理、位置编码 | ⭐⭐⭐⭐⭐ |
| PyTorch工程能力 | 熟练使用框架 | Dataset/DataLoader自定义、loss设计、模型保存 | ⭐⭐⭐⭐ |
| 语音识别基础 | 了解语音技术(加分项) | CTC原理、Conformer架构、ASR技术演进 | ⭐⭐⭐⭐ |
| 大语言模型 | 了解LLM(新增方向) | RLHF流程、SFT微调、推理优化(量化/KV Cache) | ⭐⭐⭐⭐ |
| 算法题 | 编程能力 | Medium为主,结合AI场景的设计题 | ⭐⭐⭐ |
后端开发工程师(Java/C++)
| 能力维度 | JD要求 | 真实考察重心 | 备考权重 |
|---|---|---|---|
| JVM原理 | 熟悉Java | GC收集器类型、堆内存分区(Eden/S0/S1/Old) | ⭐⭐⭐⭐⭐ |
| 并发编程 | 多线程开发 | 线程池7个参数、synchronized vs ReentrantLock | ⭐⭐⭐⭐⭐ |
| Spring框架 | 微服务经验 | IOC/AOP原理、@Transactional失效场景 | ⭐⭐⭐⭐ |
| 数据库 | MySQL/Redis | 索引失效场景、Redis基础数据结构 | ⭐⭐⭐⭐ |
| 算法题 | 编程能力 | Medium为主,基础扎实比Hard更重要 | ⭐⭐⭐⭐ |
| SQL查询 | 数据库操作 | GROUP BY配合聚合函数,子查询,窗口函数 | ⭐⭐⭐ |
核心差异点:讯飞面试和普通互联网公司的不同
讯飞是 AI 公司,不是普通互联网公司。
其他大厂面试主要考语言+算法+系统设计,讯飞算法岗在这基础上加了一整层AI理论考察。你去讯飞面AI算法工程师,面试官本身就是做语音识别/大模型的研究员,他们问的问题会更深——不是"知道Transformer吗",而是"Self-Attention的计算复杂度是多少,为什么要用Multi-head"。
如果只刷LeetCode不补AI理论,讯飞算法岗的技术面可能过不了第一轮。
三、LeetCode 高频题 Top 20(真实面经数据)
讯飞算法题整体难度:Medium为主,AI算法岗会在LeetCode题目之外额外考AI基础知识。后端和数据开发岗的算法题更接近传统互联网,基础题型占多数。
重要说明:数据开发岗会单独考SQL题,GROUP BY和窗口函数是重点。详见第四章"特色考点"。
第一梯队:必刷(出现频率最高)
| 排名 | 题目 | 题号 | 出现频率 | 考察方向 | 讯飞特色备注 |
|---|---|---|---|---|---|
| 1 | 反转链表 | No.206 | ⭐⭐⭐⭐⭐ | 所有岗位 | 基础中的基础,不会等于没准备 |
| 2 | 二叉树层序遍历 | No.102 | ⭐⭐⭐⭐ | 所有岗位 | 考变形:按层输出/锯齿形 |
| 3 | 无重复字符最长子串 | No.3 | ⭐⭐⭐⭐ | 所有岗位 | 滑动窗口入门,必熟练 |
| 4 | LRU缓存机制 | No.146 | ⭐⭐⭐⭐ | 后端/算法岗 | 数据结构设计题,哈希+双向链表 |
| 5 | 合并两个有序链表 | No.21 | ⭐⭐⭐ | 所有岗位 | 链表基础,手写不出问题 |
第二梯队:高频(至少做2遍)
| 排名 | 题目 | 题号 | 出现频率 | 考察方向 |
|---|---|---|---|---|
| 6 | 数组中的第K个最大元素 | No.215 | ⭐⭐⭐⭐ | 堆/快速选择 |
| 7 | 三数之和 | No.15 | ⭐⭐⭐⭐ | 双指针,去重逻辑 |
| 8 | 环形链表 | No.141 | ⭐⭐⭐⭐ | 快慢指针 |
| 9 | 合并有序数组 | No.88 | ⭐⭐⭐ | 双指针,逆向思路 |
| 10 | 岛屿数量 | No.200 | ⭐⭐⭐ | BFS/DFS |
| 11 | 二叉树最近公共祖先 | No.236 | ⭐⭐⭐ | DFS递归 |
| 12 | 最大子序和 | No.53 | ⭐⭐⭐ | 动态规划基础 |
| 13 | 合并区间 | No.56 | ⭐⭐⭐ | 排序+贪心 |
| 14 | 买卖股票最佳时机 | No.121 | ⭐⭐⭐ | 贪心,DP思路 |
| 15 | 全排列 | No.46 | ⭐⭐⭐ | 回溯 |
第三梯队:中频(各做1遍)
| 排名 | 题目 | 题号 | 出现频率 | 考察方向 |
|---|---|---|---|---|
| 16 | 最长回文子串 | No.5 | ⭐⭐ | DP/中心扩展 |
| 17 | 零钱兑换 | No.322 | ⭐⭐ | 动态规划 |
| 18 | 不同路径 | No.62 | ⭐⭐ | DP入门 |
| 19 | 接雨水 | No.42 | ⭐⭐ | 双指针/单调栈 |
| 20 | 滑动窗口最大值 | No.239 | ⭐⭐ | 单调队列 |
刷题规律总结
规律1:算法岗两手都要抓。 AI算法工程师面试不只考LeetCode,还考深度学习理论。刷题时间建议:LeetCode约40%,AI理论约60%。后端岗则相反,算法题权重更高。
规律2:SQL题不是选考,是必考(数据开发岗)。 GROUP BY配合聚合函数、窗口函数(ROW_NUMBER/RANK)、相关子查询,这三类必须练到手写流畅。
规律3:Medium刷熟比Hard多刷有价值。 讯飞算法题难度以Medium为主,追求Hard题数量不如把Medium题的所有追问(时间复杂度、空间复杂度、追加条件)都想清楚。
规律4:AI岗笔试有数学题。 概率论(条件概率、贝叶斯)、线性代数(矩阵乘法、特征值)、信息论(交叉熵、KL散度)——在其他大厂很少出现,在讯飞算法岗笔试偶有出现。
四、技术面试考点
特色考点:SQL查询——每个班不及格的人数
这道题在科大讯飞面经中真实出现过,是数据开发岗的经典考点。看起来简单,追问起来很有层次。
题目:成绩表 score(student_id, class_id, score),查出每个班不及格(<60分)的人数。
-- 基础写法
SELECT class_id, COUNT(*) AS fail_count
FROM score
WHERE score < 60
GROUP BY class_id
ORDER BY class_id;
第一层追问:如果要同时显示每班的及格人数和不及格人数?
SELECT
class_id,
SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS fail_count,
SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) AS pass_count
FROM score
GROUP BY class_id;
第二层追问:如果有的班全部及格(没有不及格记录),要确保这些班也显示在结果里,fail_count 显示为0?
-- 需要用班级表做LEFT JOIN,确保所有班级都出现
SELECT
c.class_id,
SUM(CASE WHEN s.score < 60 THEN 1 ELSE 0 END) AS fail_count,
SUM(CASE WHEN s.score >= 60 THEN 1 ELSE 0 END) AS pass_count
FROM class c
LEFT JOIN score s ON c.class_id = s.class_id
GROUP BY c.class_id;
第三层追问:按不及格人数降序排列,不及格人数相同的班按班号升序?
ORDER BY fail_count DESC, class_id ASC;
面试官一般不会在第一层就停下来。这道题的完整版考察的是:GROUP BY基础 → CASE WHEN条件聚合 → LEFT JOIN保留空值 → ORDER BY多字段排序。每一层都要能顺畅写出来。
AI/深度学习专项(AI算法岗,权重⭐⭐⭐⭐⭐)
1. 神经网络基础——反向传播
面试官最爱的追问方式是让你从两层网络开始,用链式法则一步步推导梯度。
核心要点:
- 前向传播:计算每层输出,保存中间激活值
- 反向传播:从loss开始,用链式法则逐层求偏导
- 权重更新:W = W - lr * ∂L/∂W
梯度消失的两个主要原因(高频追问): 1. 激活函数饱和:Sigmoid/Tanh在输入绝对值很大时,导数接近0。多层相乘后,梯度指数级缩小。 2. 深层网络链式乘法:梯度 = 多层偏导相乘。如果每层偏导都小于1,乘到第一层时梯度趋近于零。
解决方案:ReLU替代Sigmoid(导数恒为0或1)、BatchNorm稳定分布、残差连接(梯度直接绕过若干层)。
2. Transformer——Self-Attention公式
这是AI算法岗几乎必问的考点,要能手推。
Attention(Q, K, V) = softmax(QK^T / √d_k) × V
面试官追问组合: - "为什么要除以 √d_k?"(答:防止点积结果过大导致softmax进入饱和区,梯度消失) - "为什么需要Multi-head Attention?"(答:每个head学习不同子空间的语义关系,单head表达能力有限) - "位置编码为什么用sin/cos?"(答:不同频率的正弦波组合可以唯一表示任意位置;且模型可以通过线性变换学习相对位置关系) - "Self-Attention的计算复杂度是多少?"(答:O(n²d),n是序列长度,d是维度。这也是为什么长序列处理是大模型的瓶颈)
3. BatchNorm vs LayerNorm
这道题在讯飞算法岗出现频率很高,因为语音识别模型里两者都用过。
- BatchNorm:对一个batch内所有样本的同一特征维度做归一化。适合CNN,不适合RNN/Transformer(序列长度不固定,batch内样本差异大)。
- LayerNorm:对单个样本内所有特征维度做归一化。适合Transformer/BERT/GPT,不受batch大小影响。
- 讯飞特殊场景:语音识别中用的Conformer架构,同时使用了LayerNorm + BatchNorm(在卷积子层用BN,在注意力子层用LN),面试中能提到这一点是加分项。
4. 语音识别(ASR)基础——讯飞核心技术
即便你不投语音识别方向,了解这些也是面试中展示行业认知的机会。
- CTC Loss:解决语音识别中的对齐问题。语音帧数和文字长度不一致,CTC通过引入空白符(blank)和边际化所有对齐路径,计算序列输出概率。追问:"CTC如何处理重复字符?"(答:中间必须有blank分隔,否则视为单个字符)
- Conformer架构(后的主流ASR模型):Transformer + 卷积的混合架构。Transformer捕捉长程依赖,卷积捕捉局部特征,两者互补。比纯Transformer的ASR性能提升约15%。
- 技术演进:HMM-DNN → Attention-based Seq2Seq → CTC → Conformer/Whisper
Python & PyTorch专项(AI工程师,权重⭐⭐⭐⭐)
PyTorch自定义Dataset(工程能力考察高频题):
```python from torch.utils.data import Dataset, DataLoader
class SpeechDataset(Dataset): def init(self, data_list, transform=None): self.data = data_list self.transform = transform
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
sample = self.data[idx]
if self.transform:
sample = self.transform(sample)
return sample