
搜狗2020校招研究岗笔试第二场我考完那天就在备忘录里写了不少复盘后来反复翻出来看发现很多经验对后来准备算法岗笔试的人都有用。这个岗位的笔试不光是考你刷了多少题更重要的是看你对机器学习、深度学习这些基础有没有真正理解到位以及现场能不能在有限时间内把一个问题的思路落成代码。这套笔试面向的主要是投递搜索、推荐、NLP、语音这些研究方向的应届生内容跨度大、题量紧如果没提前摸清套路很容易在前面磨太久导致后面大片空白。这篇文章我把第二场的考点分布、典型题型、答题策略和踩坑记录都整理出来尽量还原当时的真实体验。不管你是正在准备校招还是想系统梳理算法岗笔试的常见考法都可以拿来做参考。1. 搜狗研究岗笔试到底考什么整体设计思路与考点分布1.1 为什么搜狗的笔试有种“混合体”的感觉搜狗研究岗的笔试相比纯开发岗最大的区别是它不满足于你只是一个会写代码的人。它希望候选人对机器学习、深度学习的理论有系统理解同时对搜索引擎、输入法、推荐系统这些实际业务有基本概念。所以题面设计上代码题、机器学习理论题、数学概率题、业务场景题都占一定比例这种混合结构在互联网大厂的研究岗笔试里并不罕见但搜狗的命题风格更偏向“工程与研究结合”。第二场和第一场相比题目整体难度相当但明显感觉到顺序做了调整把两道偏业务场景的选择题提前了上来就考察你对搜索排序和用户行为的理解。有同学吐槽说这不是研究岗吗怎么还考业务后来想想也合理搜狗的搜索和输入法业务需要研究人员对线上产品逻辑有感觉纯理论派不一定能直接上手。1.2 题型构成与分值权重从整体结构来看第二场笔试大致分为四类主题我在下面整理了一个占比参考表题型模块大致占比考察重点常见形式编程题35%数据结构、动态规划、字符串处理2道核心代码题机器学习理论30%模型推导、损失函数、过拟合与调参单选题简答数学与概率15%概率计算、线性代数、最优化思想选择题填空领域业务题20%搜索排序、推荐策略、NLP基础场景题以上比例不是官方给的是我根据自己做题时的体感估计但大方向差不多。编程题的分量最重代码题如果有任何一道完全空着基本就告别下一轮了。机器学习理论题虽然每题分值不大但胜在数量多很多同学代码题写出来了反而在这部分丢了太多分。1.3 第二场特有的节奏陷阱第二场比第一场更阴的地方在于它混入了几道“看起来很难但实际很简单”的题也混入了“看起来很简单但实际有坑”的题。我记得有一道关于朴素贝叶斯假设的选择题题干描述很复杂绕了半天说的是“特征之间相互独立”选项里还放了各种很唬人的术语其实只要抓住条件独立这个核心答案就很明显。这类题就是用来干扰心态的如果你上来就被题干吓住后面的节奏会乱。第二场还有一个明显特征是部分选择题存在多选多选少选都不得分。这意味着你在不确定的时候不能瞎蒙得对知识点有比较准确的把握否则不如跳过省时间。2. 核心题型与知识点拆解2.1 编程题数据结构与动态规划是重头搜狗研究岗笔试的编程题没有到LeetCode Hard那种劝退程度基本在Medium上下浮动但对代码的完整度和边界处理要求很高。第二场的两道编程题一道是字符串相关的动态规划另一道是树结构的遍历变形。字符串那道题核心是判断一个字符串能否通过若干次“相邻字符交换”变成目标字符串并且要求最小交换次数。这题如果熟悉逆序对的概念会发现它本质是在问“两个排列之间的最小相邻交换次数”解法就是把目标字符串的位置映射到原字符串上然后求逆序对数量。我当时没有直接用归并排序求逆序对而是用树状数组做的因为现场写归并排序更容易在边界条件上出错。树状数组实现短、不容易错适合笔试场景。这里贴一段核心逻辑方便你理解def min_swaps(s: str, target: str) - int: # 将target中每个字符按出现顺序编号映射到s中 pos [[] for _ in range(256)] for i, ch in enumerate(target): pos[ord(ch)].append(i) # 为s构造映射序列 ptr [0] * 256 seq [] for ch in s: c ord(ch) if ptr[c] len(pos[c]): return -1 seq.append(pos[c][ptr[c]]) ptr[c] 1 # 求seq的逆序对数量 size len(seq) bit [0] * (size 1) def update(i): i 1 while i size: bit[i] 1 i i -i def query(i): res 0 i 1 while i 0: res bit[i] i - i -i return res ans 0 for i, v in enumerate(seq): ans i - query(v) update(v) return ans这类题考察的不是你会不会背模板而是能不能快速识别问题本质。如果你能想到逆序对代码二十分钟就能写完如果想不到可能纠结一小时都做不出来。树那道题是关于多叉树的要求计算从根节点到每个叶子节点的路径中满足某种节点值大小关系的路径数量。这个跟DFS遍历有关需要在递归时维护状态我当时用一个全局计数器来记录结果注意在每次递归进入时更新状态、退出时恢复状态防止状态污染。树的题在笔试中出现频率极高主要是因为它既能考递归思想又能考复杂度的估算。2.2 机器学习基础题从推导到场景应用搜狗研究岗笔试的机器学习部分不像有些公司只靠八股文很多题是需要实际推一遍才能做对的。第二场里印象比较深的一道题是考察逻辑回归损失函数对参数的梯度推导。题目给了几个选项都是梯度表达式的变体如果只看过公式没动手推过很容易被选项里的符号绕晕。逻辑回归的损失函数是交叉熵对参数求梯度之后会得到 ( (h_\theta(x) - y) x_j ) 的形式关键在于是先有 sigmoid 的输出再乘以特征值而不是直接拿原始特征去乘。还有一道题是关于决策树的问信息增益和基尼指数在二分类下什么时候会选不同的划分特征。这题其实有点坏因为信息增益和基尼指数在多数情况下选出的特征是一致的只有在类别分布很不均衡时才会出现分歧。如果你只是机械地背“信息增益用熵基尼指数用基尼系数”很难想到它们的选择差异条件。深度学习相关的内容也占了不少主要围绕卷积神经网络的参数量计算、感受野变化、以及循环神经网络中的梯度消失问题。参数量计算是送分题但要细心卷积核的通道数、偏置项都要算进去。感受野变化则考察你对层叠卷积的理解这类题建议考前把公式 ( R_{out} R_{in} (k-1) \times \prod_{i1}^{l-1} s_i ) 记住能省不少推导时间。2.3 数学与概率题不可忽视的送命题很多人准备算法岗笔试会把大量时间花在刷题和背机器学习题上数学概率部分常常忽略这其实很危险。搜狗第二场的数学题难度不算高但都是那种“稍有疏忽就错”的类型。有一道概率题考的是两个人轮流抛硬币先抛出正面的人获胜问先手获胜的概率。这个题经典到不能再经典了答案就是 ( \frac{2}{3} )如果第一次正面直接赢概率是 ( \frac{1}{2} )如果第一次反面那么局面相当于后手变成了先手所以方程列出来很快。笔试题的难度基本就是这个量级不会故意上随机过程那套宏大叙事。线性代数部分有一题考的是矩阵特征值的性质给了一个具体的二阶矩阵问它的迹和行列式分别是多少。这里不只是套公式而是结合了特征多项式来反推属于比较基础的线性代数知识但如果你很久不动手算现场很容易算错。最优化思想也出现了一小问题目大致是问梯度下降法在接近最优点时为什么收敛速度会变慢。这题的逻辑其实很简单梯度的大小随着接近最优点而趋近于零所以每次更新的步长也在变小。如果面试官展开追问还可能要你回答牛顿法为什么收敛更快因为使用了二阶信息但笔试阶段只要答出梯度趋向于零就够了。2.4 领域知识题搜索、NLP、推荐的基本功搜狗的业务核心是搜索和输入法所以笔试题里自然少不了相关领域的题目这部分也是很多纯刷题选手容易丢分的地方。搜索排序相关的那几道题核心围绕查准率、查全率、倒排索引、BM25。我记得有一题给出了一个非常小的文档集合让你判断某个查询词能召回哪些文档本质是在考倒排索引的结构。这类题只要你理解倒排索引的思路就很简单对每个词建立文档列表查询时取交集或并集。还有个业务场景题是输入法相关的大意是在用户输入拼音序列时系统需要给出候选词排序问哪种策略最合理。这里面涉及语言模型、用户个性化、以及上下文信息。正确答案是把语言模型得分和用户历史输入偏好结合起来如果你只选了“基于词频排序”那个选项说明对输入法候选排序的理解还停留在很初级的阶段。NLP部分还考了一个命名实体识别中的标签体系问题问 BIO 标注里 B、I、O 分别代表什么这道题在当年算是基础中的基础但放到现在如果转行选手没系统学过NLP确实容易懵。B 表示实体开始I 表示实体内部O 表示非实体。这类题考查的不是难度而是你到底有没有认真做过NLP相关的项目。3. 实操复盘从时间分配到代码细节3.1 120分钟怎么分才科学搜狗第二场笔试的时间设置是120分钟这个时长听起来宽松实际上因为题量大、切换频繁很多人最后会剩十几分钟但不敢提交在那边反复检查又改错几道选择题。我的实际时间分配是这样的前15分钟做选择题遇到不确定的立刻标记跳过不要恋战。数学和概率题如果30秒没思路就先放着后面有时间再回来。中间70分钟集中做两道编程题。先审题5分钟明确输入输出和边界条件再动手写代码。一般来说第一道代码题30分钟内必须解决第二道可以放宽到40分钟。最后25分钟回头检查跳过的选择题重点检查多选和计算题。剩余时间检查代码有没有数组越界、递归死循环这些低级问题。最后10分钟无论如何要提交不要在最后一刻还在改代码笔试系统有时候会卡顿。这个节奏看起来很简单但实际操作中最大的敌人是“手痒”。很多同学看到一道熟悉的编程题恨不得马上把代码写出来结果写到一半发现理解错了题目反而浪费时间。我的建议是读题至少读两遍把样例输入输出在纸上手动推一遍再开始写代码。这个习惯能帮你规避至少三成以上的低级错误。3.2 代码输出与边界处理细节研究岗笔试的代码题在线评测系统往往非常严格不仅看最终结果还会看超时和内存使用。以下是我在实际做题时总结的几个细节一是输入处理。搜狗的笔试系统支持多种语言但是输入格式统一是标准输入输出。很多 C 选手用 cinPython 选手用 input()但如果数据量大推荐使用 sys.stdin 一次性读入再解析能明显降低耗时。特别是树结构的题节点数量可能到十万级别循环用 sys.stdin.readline() 逐行读比 input() 更稳。二是递归深度。Python 的默认递归深度是1000如果树的题是链状结构递归到几千层就会报 RecursionError。这种时候有两种办法一种是在代码开头写上import sys; sys.setrecursionlimit(1000000)另一种是干脆用迭代栈模拟递归。笔试现场可能不会给你很多调试时间所以看到树的题第一反应就应该是“我会不会递归爆栈”。三是输出格式。有的题要求输出浮点数并保留两位小数有的要求输出整数有的要求输出列表时用逗号分隔。这些细节在题目描述里一般都有但紧张起来很容易忽略。我见过有同学代码逻辑全对就因为最后输出多了个空格被判错这种真的很冤。3.3 笔试环境与输入输出细节搜狗笔试用的在线平台在2020年那会儿偶尔会出现编译器版本较老的问题比如 C 的某些新特性不支持。如果你是用 C 答题建议尽量写兼容性强的代码不要依赖 C17 才有的特性。Python 则要注意版本是 2 还是 3虽然当时主流已经是 Python 3但最好提前在下面看清楚可选语言版本免得现场写一半发现语法不兼容。还有一个小细节本地IDE和在线评测环境的差异。很多人习惯在本地用 IDE 调试手动造几个测试用例感觉没问题就复制过去结果提交后出现“段错误”或“内存超限”。原因通常是本地测试数据量太小没有暴露数组越界或死循环。我的习惯是写完代码后自己构造几个极端测试用例比如空输入、一个节点的树、最大数值的边界情况尽量在提交前把问题暴露出来。4. 常见问题与避坑记录4.1 容易卡壳的三种情形综合我和周围同学的经历第二场笔试最容易让人卡壳的往往是下面三种情况。第一种是选择题卡在某个数学计算上。概率题有时候列式简单但简化分数的时候会让你犹豫半天尤其是选项不是标准分数而是带小数点的近似值。我的经验是不要试图心算到最后一位先算出精确表达式再和选项粗略对比选出最接近的即可。如果差距不明显大概率是你前面的表达式列错了及时回头检查思路而不是继续死磕计算。第二种是编程题卡在数据范围上。比如题目说了节点数最大是十万时间复杂度必须控制在 O(n log n) 以内如果你下意识写了一个 O(n²) 的暴力解法测试用例可能前面几个能过最后一个大数据量用例直接超时。在时间紧迫的情况下与其赌测试数据不够大不如一开始就思考有没有更优的数据结构。树状数组、并查集、哈希表这些常用结构一定要能在不查资料的情况下默写出来。第三种是简答题卡在表达上。研究岗笔试不仅有选择、代码偶尔还会有一两道简答题要求你用文字描述某个算法的思路。这种题不要想着长篇大论面试官看你答案的时间不会超过三十秒最好按照“核心思路、具体步骤、复杂度分析、适用场景”的顺序分条写逻辑清楚比辞藻华丽重要。4.2 易错点速查表根据第二场的考题风格我整理了一张易错点速查表这些点都是我在实际做题过程中看到的“高频丢分点”知识点易错点正确理解逻辑回归梯度容易把 sigmoid 输出和原始特征搞混梯度是 ( (h(x)-y)x_j )不是 ( (x-y)h(x) )朴素贝叶斯题目绕了半天核心是条件独立假设给定类别时特征之间相互独立树形DP递归时状态被重复利用导致污染进入递归前修改状态退出时恢复现场逆序对直接用冒泡模拟交换次数用树状数组或归并排序O(n log n) 解决输入法候选排序只看词频要结合语言模型和用户个性化信息Python递归深度树在链状时直接爆栈设置递归上限或用迭代栈这张表里最容易被忽略的是“输入法候选排序”那一条因为很多人对输入法的理解停留在“拼音转汉字”很难想到它背后其实是一个完整的排序系统。搜狗在这个领域积累很深研究岗笔试问你这类题本质是想看你能不能把机器学习中的排序问题迁移到实际产品场景中。4.3 给后来人的建议考前怎么针对搜狗题库做准备如果你打算投搜狗的研究岗考前复习不能只盯着通用题单。搜狗的笔试题有明显的“搜索输入法”基因所以建议你在常规刷题之外额外做三件事。第一件事是把搜索引擎的经典知识过一遍包括倒排索引、BM25、PageRank、TF-IDF。不要求你能推导全部公式但至少要理解它们解决什么问题以及互相之间有什么差异。笔试如果考到这类内容基本就是送分题你不能不要。第二件事是重温NLP的基础概念包括语言模型、词向量、命名实体识别、文本分类。搜狗的研究岗很多方向跟文本相关刷题的时候顺带看一遍NLP的基础知识不仅对笔试有帮助对后面面试也有用。第三件事是限制时间做整套题不要只做单题。笔试不只是考你会不会还考你在有限时间内能拿多少分。考前至少完整模拟两次体验一下120分钟连续切换学科的节奏这样才能找到适合自己的时间分配方式。我在准备搜狗笔试前每次模拟都是严格按时长来做做完以后把错题整理成文档重点标注“为什么错”。这个习惯让我在第二场考试时明显更稳很多坑因为提前踩过现场就绕开了。最后再说一点个人感受。搜狗的笔试是我秋招参加过的所有研究岗笔试里风格最“业务友好”的一套题。它不会像某些公司那样出特别偏门的题目来刁难你而是更愿意把问题放在搜索、输入法、推荐这些真实场景里。这种命题风格也意味着你光靠刷 LeetCode 是不够的还需要对机器学习的基础理论和实际应用场景有整体理解。希望这篇复盘能帮你在准备过程中少走一些弯路。