免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

科大讯飞研发岗秋招笔试复盘:题型考点与编程思路全解析

科大讯飞研发岗秋招笔试复盘:题型考点与编程思路全解析 每年八月底到九月初是秋招笔试最密集的一段时间。我在投科大讯飞研发岗的时候本来没抱太大期望结果笔试通知来得比预期快而且整个流程走下来发现它的笔试风格和互联网大厂差别挺明显的。这篇就完整复盘一下2024年秋招科大讯飞研发岗的笔试从题型分布、考点侧重到编程题的解题思路把能回忆起来的细节都写了给后面准备校招的朋友一个参考。科大讯飞的研发岗笔试用的在线笔试平台整体题量不大但覆盖面广尤其是技术选择题部分考察得相当细。如果你准备过一些中大厂的笔试上手应该不难但有几个地方确实容易栽跟头比如C模板、操作系统调度算法、数据库索引失效场景这些题目不是单纯背概念就能答对的。我把我还记得的题目类型和现场做题的思路整理一下顺便说说哪些地方值得重点准备。1. 笔试整体结构与时间分配科大讯飞研发岗的笔试总共是120分钟题量分两块一块是技术选择题30道左右涵盖C、Java、数据结构、操作系统、计算机网络、数据库另一块是编程题3道难度呈梯度上升。从体感上来说选择题比编程题更拉分因为编程题只要思路对了实现起来不难但选择题里有些题目考查的细节非常冷门没有系统复习的话很容易模棱两可。我当时拿到试卷第一反应是选择题的占比比想象中大。很多公司研发岗笔试已经变成纯算法题或者算法题占大头但科大讯飞不太一样它对基础知识的考察仍然很重视。这也符合讯飞的业务特点毕竟语音识别、自然语言处理这类方向底层大量依赖C的高性能实现对候选人的语言功底和系统知识要求不会低。时间分配上我建议选择题控制在45到50分钟内完成剩下70分钟留给编程题。编程题每道大约20到25分钟最后留10分钟检查。实际做的时候如果一道选择题卡了超过两分钟果断先蒙一个标记一下回头再看。千万不要在选择题上恋战编程题的分值密度更高丢一道会非常伤。编程题的运行环境支持C、Java、Python、Go等主流语言C用的是GCC支持C17标准Java是JDK 1.8或以上Python是3.x版本。这点对用Java或C刷题的人比较友好但如果你用的是比较少见的语言比如Rust或者Kotlin有可能会碰到编译环境不支持的尴尬情况。建议提前上牛客或者赛码网熟悉一下环境避免到了考场上连输入输出都调不明白。2. 技术选择题考点详细拆解2.1 C与Java语言基础科大讯飞的C题目考得很扎实不浮于表面。我记得有几道题挺有代表性。一道是问std::vector在push_back触发扩容时的迭代器失效问题这个不算难但有个变体问的是reserve之后push_back到超过reserve容量时begin()返回的迭代器是否仍然有效。如果不清楚reserve只改变容量不改变大小、并且超过预留容量时依旧会重新分配内存这个机制很容易选错。还有一道问std::shared_ptr的循环引用怎么解决标准答案是weak_ptr但题目给的选项里有一个干扰项是“将shared_ptr成员改为unique_ptr”乍一看好像可以实际上不行因为unique_ptr不支持拷贝语义在很多场景下根本无法替代shared_ptr去打破循环引用。这种题目考的就是你对智能指针底层引用计数的理解程度建议准备时把shared_ptr、weak_ptr、unique_ptr三者的区别和适用场景彻底搞清楚。Java方向考了一道关于HashMap在JDK 1.7和JDK 1.8中插入链表节点的区别题目问的是JDK 1.8中链表转红黑树的阈值是多少答案是8但选项里混了一个“当链表长度大于等于8且数组长度大于等于64时才转红黑树”的选项这个描述其实是准确的但如果题目问的是“触发转换的链表长度阈值”应该选8而不是选那个带数组长度条件的选项。题目本身不难关键是审题要看清楚问的是阈值还是完整条件。像这类题平时看源码、看原理文章的人占便宜只背面试题的人容易掉坑。2.2 操作系统与计算机网络操作系统部分考了进程和线程的区别、死锁的四个必要条件、虚拟内存页面置换算法。最让我印象深刻的是有一道题问的是在LRU页面置换算法中当分配给进程的物理页框数为3页面访问序列为7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1时一共发生多少次缺页中断。这道题需要现场手动模拟整个置换过程非常费时间。我在做的时候先在草稿纸上画了三列按顺序逐行填中间差点算错。如果之前刷过操作系统的课后习题对这种题应该不陌生但如果在选择题里出现建议先放到最后再做别让一道题拖垮节奏。计算机网络考了一道TCP拥塞控制的题考察的是慢启动阶段当拥塞窗口从初始值增长到慢启动阈值之后切换为拥塞避免的过程。题目模拟了一个具体场景要算在某个RTT之后拥塞窗口的大小。这种题需要你对慢启动、拥塞避免、快重传、快恢复的算法细节很熟。科大讯飞的网络题不算偏但也不会只考“三次握手、四次挥手”这种人人都背的送分题它会往下挖一层所以要准备得稍微深一些。另外还有一道关于HTTP状态码的题目问301和302的区别这个是基础但要注意题干描述是“永久重定向”还是“临时重定向”选项里容易故意调换。2.3 数据库与SQL数据库考了两道题一题是索引相关的问在什么场景下索引会失效。选项包括对索引列进行函数运算、使用LIKE前缀模糊查询、OR连接多个条件且其中一个列没有索引、隐式类型转换。如果平时写过业务SQL这些应该都能选对。但有一个选项是“使用IN查询大量数据”这个在特定条件下确实可能让优化器放弃索引但在题目语境下单靠这一点不足以直接判断“索引失效”所以最佳答案是排除它。这类题不能靠死记需要结合执行计划理解的深度。另一道数据库题给了两张表一张学生表一张成绩表要求用SQL查出“每门课程成绩最高的学生姓名和分数”。这算经典的GROUP BYJOIN问题难点在于找出每门课程的最高分之后再去关联学生信息。我当时写的思路是先用子查询查出课程ID和最高分再JOIN回去拿学生ID最后再关联学生表拿姓名。如果你平时用MySQL比较多这种题应该秒解。比较坑的是它是在选择题里让你判断哪个SQL语句能正确执行四个SQL看起来都差不多区别在GROUP BY后能不能直接查非聚合列以及子查询的关联条件是否正确。建议复习时把“分组取每组最大值”这类SQL的多种写法都过一遍。3. 编程题完整复盘与解题思路3道编程题在赛码网上完成整体难度不算高大概相当于LeetCode中等偏下的水平但每一道题都有一些细节需要注意。题目不能完整还原我能回忆起来的大致如下。3.1 第一题字符串压缩与解压这道题要求实现一个简单的字符串压缩算法将连续出现的相同字符替换为该字符加出现次数比如aaaabbc压缩后是a4b2c1。但是有个附加条件——如果压缩后的字符串长度不小于原字符串长度则输出原字符串。输入是一个长度不超过10^5的字符串只包含小写字母要求输出压缩后或原字符串。核心思路很简单一次遍历统计连续相同字符的个数拼接到结果字符串中。因为长度可能达到10^5直接用Python字符串拼接在循环里会导致大量创建新字符串时间复杂度退化为O(n^2)所以在C里用std::string的push_back或append在Python里用.join()收集到列表再一次性拼接。这一步实现细节很关键虽然题目场景不大但如果平时没有养成好习惯遇到大数据量就容易在超时边缘徘徊。伪代码如下string compressString(string s) { string res; int n s.size(); for (int i 0; i n; ) { int j i; while (j n s[j] s[i]) j; res.push_back(s[i]); res to_string(j - i); i j; } return res.size() n ? res : s; }这道题唯一的坑在于压缩后长度等于原长度时应该输出原字符串因为题目要求“不小于”。如果你用了判断边缘用例直接挂。这种细节题平时训练时一定要养成看边界条件的习惯。3.2 第二题数组切分与最大最小差第二题是给定一个长度为n的整数数组要求将其切分成恰好k段每段非空求一种切分方式使得所有段内部的和的最大值与最小值的差值最小。输入范围是n不超过10^5k不超过n。这题第一眼看上去像是动态规划但仔细分析之后发现不是。让每段和尽量平均其实对应的是“最大值最小”的二分答案思路。先二分一个目标值mid判断能否用不超过k段把所有元素都覆盖且每段和不大于mid。如果mid可行说明可以尝试更小的值如果不可行就增大mid。这里要特别注意如果k等于1那答案就是0不需要二分。判断函数怎么写是关键从左到右贪心地累加元素一旦当前段的和加上下一个元素会超过mid就切一刀开始新的一段。最终如果切出的段数大于k说明mid太小不可行。这里需要注意如果数组里某个元素本身就大于mid那么直接不可行因为每个段至少包含一个元素。时间复杂度是O(n log(sum))可以通过。这道题属于非常经典的二分答案应用题如果你刷过“吃香蕉”或“分割数组的最大值”这类题应该一眼就能识别出来。我当时写这段代码的时候在判断边界上多花了点时间因为数组里可能有负数。后来仔细看题目说明数组元素范围是非负整数所以贪心判断的逻辑是正确的。如果数组里有负数这个解法就不成立所以审题很重要。3.3 第三题树上的最大独立集第三题是给一棵n个节点的无根树节点编号从1到n每个节点有一个权值。要求选择若干个不相邻的节点使得选出的节点权值之和最大。输入保证是一棵树范围n不超过2 * 10^5。这题基本就是LeetCode 337的进阶版从二叉树扩展到了普通树。解题思路很直接做树上DP。任选一个节点作为根比如1号节点做一次DFS。每个节点维护两个状态dp[u][0]表示不选当前节点时子树能拿到的最大权值和dp[u][1]表示选当前节点时子树能拿到的最大权值和。状态转移如果不选当前节点那么它的每个孩子可以选也可以不选取最大值累加dp[u][0] sum(max(dp[v][0], dp[v][1]))如果选当前节点那么它的孩子都不能选dp[u][1] weight[u] sum(dp[v][0])最后答案就是max(dp[root][0], dp[root][1])。这个题在实现时要注意递归深度。n是2 * 10^5的情况下用递归DFS在C里可能会爆栈默认栈空间大概8MB递归深度过大时会栈溢出。我在赛码网上写的时候直接用递归过了可能和评测机设置的栈空间较大有关但在本地或某些平台上就不一定了。建议准备时写一个非递归的DFS或者用栈来模拟递归过程或者直接加编译指令#pragma comment(linker, /STACK:1024000000,1024000000)。如果用Java或Python也要注意递归层数限制Python需要手动设置sys.setrecursionlimit()但这个办法只能提高上限无法真正解决栈内存问题最稳的还是改成递推。另外输入格式要留意它给出的是n-1条边是无向边需要先建邻接表再做DFS。我在建图时遗漏了反向边导致第一次代码只有部分样例通过后来检查才发现。这个小错误提醒我树相关的题建图时一定要记得把两个方向的边都加进去。4. 行测与性格测试部分科大讯飞的笔试除了技术题之外还有一个独立的行测环节时间大概20到30分钟包含几道图形推理、言语理解和逻辑判断。这个环节不和技术题一起计时而是单独分成一个模块。图形推理题和公务员行测里的题型基本一致常见的有图形旋转、对称性、笔画数、封闭空间数量规律。我印象比较深的一道题是给了一组图形问下一个图形是什么规律是每个图形的封闭区域数依次递增1前几个图形分别是1、2、3、4个封闭区域正确答案是5个封闭区域的图。这类题对理工科学生不算难但如果你没有提前练过可能会一时转不过弯来。言语理解题有一道给了一段关于人工智能产业发展的话要求选出这段话的主旨。这种题需要找中心句答案一般是“人工智能产业需要完善基础设施”或者“数据是人工智能产业的关键要素”之类的选项。看起来是送分题但选项里经常会有两个非常接近的表述差别在“关键”和“基础”这类词上需要仔细辨别。逻辑判断题考了一道典型的“如果A那么B”的逆否命题以及一段关于“所有S都是P”的三段论。总体难度不大但有个别题目的文字描述比较绕需要静下心来做。建议平时刷几套行测题找找感觉不至于在考场上被这种题型打得措手不及。性格测试部分则是大量重复相似的问题比如“在工作中你更倾向于独自完成任务还是团队协作”、“面对压力时你通常会保持冷静还是感到焦虑”。这类题目没有标准答案核心原则是前后一致不要一会儿选完全对立的两项。很多平台的测谎机制会检测这种矛盾项一旦被标记为不诚实可能直接淘汰。所以在做性格测试时不用花心思去琢磨“公司想要什么样的人”就选最真实的答案但务必保持一致性。5. 备考资源与复习规划建议科大讯飞研发岗的笔试整体来说更偏重基础知识的扎实程度而不是偏题怪题。如果你的复习时间比较紧我建议按照以下优先级来安排。第一优先级数据结构与算法。编程题三道题覆盖了字符串处理、二分答案、树上DP这些都是LeetCode高频题型的变种。刷题的话建议把LeetCode Hot 100刷透尤其是数组、链表、二叉树、动态规划这几类。针对科大讯飞可以额外多刷一些二分答案和树上DP的题目类似的题目在力扣上至少有几十道。第二优先级C和Java语言基础。这部分主要靠平时的积累但突击时可以把常见的“高频易错题”过一遍比如虚函数表、智能指针、内存对齐、HashMap原理、并发编程基础。网上有很多“大厂C面试题汇总”之类的资料直接用就行但不要只看答案要搞懂底层逻辑不然换一个问法就懵了。第三优先级操作系统、计算机网络、数据库。这三门课是选择题的主力。如果时间紧重点复习进程线程、死锁、内存管理、TCP/IP、HTTP、索引和SQL优化。建议找几套往年的笔试真题做一下了解出题风格比单纯看书效率高。行测部分不用刻意准备太久提前一天看看图形推理的常见规律总结就差不多了。这部分分值占比不大拉开差距的永远在编程题。还有一个容易被忽略的准备工作提前熟悉在线笔试平台。科大讯飞用的平台支持本地IDE调试这个其实是很友好的设置。像有些公司是纯网页编辑器不支持本地编译那种情况下很多人会非常不适应输入输出格式都要反复调试。科大讯飞这个可以说对考生很友好了至少不用在网页编辑器里写代码可以先用本地IDE跑通再粘贴上去。6. 实战中容易踩的坑和避坑经验我整理一下自己在这次笔试过程中遇到的几个问题这些都是平时刷题时不太会注意的细节但在真实笔试场景里非常影响心态和成绩。第一个坑是编译环境。我的第一道题用C写的本地编译运行没有问题但复制到在线平台之后发现报编译错误。原因是本地编译器默认支持的是C14而我在代码里用了std::string的starts_with方法这是C20才引入的评测环境的C17根本不认识。所以建议提交前确认自己的代码里没有用到高版本标准特有的新特性。尤其是C17和C20之间差了不少新东西比如std::string::contains、std::span、std::bit_cast这些在旧标准下都会编译失败。第二个坑是输入输出格式。赛码网有些题目的输入是一整行需要自己按空格拆分有些是多行输入第一行是测试用例数量。考试时如果没仔细看题目描述里的输入说明直接用cin a b去读可能会漏读或者多读。我的一个习惯是拿到题目先看样例输入输出再找输入范围的说明这样能快速判断是多组测试还是单组测试。另外有些平台要求输出后不能有多余空格否则会被判格式错误。这些细节一定要小心。第三个坑是时间分配。我一开始在选择题上花的时间太多了有几道题反复纠结导致最后做编程题的时候时间有点紧张。第一道编程题比较容易过得还算顺利但第二道题因为要推二分答案的边界多花了一点时间到第三道题的时候剩的时间不太多了。好在第三道题我一眼就看出是树上DP写起来快不然很可能做不完。建议大家在正式笔试前掐表做一两套模拟题适应一下节奏。第四个坑是本地IDE调试和在线提交的差异。有些同学的本地环境是Visual Studio默认开启了异常处理和安全性检查同样的代码在VS里可能能跑但是GCC编译环境下就会给出不同的行为。比如scanf和printf在VS里要用scanf_s和printf_s但在在线评测平台上只能用标准版本。反过来如果你在VS里用了#include pch.h这种预编译头提交到OJ上也会直接编译失败。最稳妥的方式是平时刷题就用命令行GCC编译保持和OJ环境一致。7. 科大讯飞研发岗笔试之后的流程衔接笔试通过之后一般会进入面试环节。科大讯飞的面试流程通常是两到三轮技术面加一轮HR面。技术面会围绕简历上的项目深挖也会问一些手写代码的题目难度和笔试编程题相当。另外科大讯飞比较看重语音相关的基础如果你投的是AI研发岗最好提前了解一些语音识别、语音合成、自然语言处理的基本概念比如MFCC特征提取、HMM模型、端到端语音识别框架、CTC loss等等。但如果投的是通用研发岗这些不会考得很深。面试节奏方面科大讯飞整体进度不算快从笔试结束到面试通知隔了一周左右。所以笔试完之后不用太焦虑保持手机和邮箱畅通就行。我在等待期间就继续刷题、看面经没有干等。还有一个细节科大讯飞的校招官网和公众号会同步更新招聘进度状态从“笔试中”变成“面试中”一般就说明笔试通过了。有些同学习惯等邮件通知其实官网上看更及时。8. 关于智能汽车方向的一些观察如果投递的是科大讯飞智能汽车相关的研发岗笔试内容可能略有变化因为我在刷牛客的时候看到有投智能汽车方向的同学反馈他们的笔试题里多了一些和车载系统、嵌入式相关的考察点比如Linux内核基础、交叉编译、CAN总线协议、音视频处理甚至有一两道汽车电子相关的选择题。这类岗位和通用的服务端研发岗笔试风格差异比较大如果你投的是这个方向建议提前去牛客或知乎搜一下具体的笔经不要只按通用的研发岗去准备。另外科大讯飞在智能汽车方向有布局智能座舱、语音交互、车载语音助手这些方向都缺人。如果你有嵌入式或者音视频处理的经验这个方向会是个不错的切入点。即使笔试题目里有一些不熟悉的内容也不至于直接淘汰因为多数情况下还是以基础和算法题为主专业方向题占比有限。9. 笔试当天的时间安排与心态调整笔试当天建议提前半小时到电脑前把网络和摄像头测试好。科大讯飞的笔试系统会要求开启摄像头考试过程中会不定时抓拍所以提前把桌面整理干净不要放小抄。我考试那天因为电脑电量不够中途插了电源结果摄像头卡了一下差点被系统判定异常。虽然最后没有影响成绩但当时确实吓出一身冷汗。心态上不要因为选择题有几道不会就紧张。这套笔试题的整体难度属于中等偏上但它的淘汰线并不高。科大讯飞更看重的是你能够稳定发挥把会做的题做对而不是每道题都能满分。我当时选择题至少有两道是完全拿不准的蒙完之后直接跳过编程题三题都做出来了最后也过了。所以做题时的心态就是遇到不会的题先标记快速往前推进不要把时间浪费在情绪内耗上。另外如果笔试过程中出现网络断线、系统卡顿等突发情况不要慌第一时间截图或者录屏保留好证据然后联系科大讯飞校招组的官方邮箱说明情况。一般来说官方会给出补考或者延时的安排但如果什么都不说就只能认栽了。科大讯飞研发岗的笔试总结下来就是选择题考基础、考细节编程题考思路、考稳定输出。没有特别离谱的偏题怪题只要你把数据结构和算法基础打牢再把语言基础和操作系统网络数据库的重点过一遍通过笔试是完全有机会的。如果你正在准备秋招加油希望这篇复盘能帮到你。
返回列表