乐信金融科技算法岗笔试复盘:从KMP到风控模型的备考指南 📅 发布时间:2026/9/1 22:10:04 👁 浏览次数: 2020年秋招那阵子我最大的感触就是算法岗笔试的“内卷”已经开始了。乐信作为金融科技公司算法岗那套笔试题我到现在还留着印象三道编程题加两道问答设计题限时三个小时。它不像某些大厂纯靠hard题压人也没有简单到背背模板就能过整体难度更偏向“基础扎实 业务感觉”的组合拳很适合用来复盘算法岗笔试题到底怎么准备。今天把这场笔试的题型结构、解题思路以及我后来面试和工作中验证过的备考方法一起整理出来希望对准备投算法岗的学弟学妹有用。1. 总体印象这3小时到底在考什么1.1 题型分布与时间分配乐信这套笔试题给我的第一印象是类型齐全但节奏还算合理。编程题三道覆盖字符串、搜索/动态规划、以及一个偏业务场景的算法设计后面跟着两道简答题考的是机器学习基础概念和风控场景分析。整场下来三个小时正好够用但如果做题顺序不对很容易在前面某道题上卡太久导致后面的大题没时间写。我后来复盘时总结了一个比较稳妥的时间分配方式前40分钟先解决第一道和第二道编程题这两道通常是不需要考虑复杂优化的问题能拿全分就拿全分第三道题给40到50分钟因为它往往需要建模和权衡写的相对完整才能体现能力最后剩下的时间全部给问答和设计题。简答题虽然单题分值不高但算法岗是简历、笔试、面试多轮筛选笔试中简答题写得好不好直接决定你能不能进下一轮所以千万别只抱着编程题猛刷。1.2 难度分层与考察方向这套题的难度分布很典型从数据结构基础题到中等偏上的动态规划再到开放性业务题层层递进。第一梯度的题目基本是“看一眼就有思路”的题比如链表操作、数组处理、简单的字符串匹配第二梯度就需要一些算法储备比如贪心策略、区间合并、变种的最短路径第三梯度则考察你对模型、特征、业务指标的综合理解。这里想多说一句金融科技公司的算法题和纯互联网公司不太一样。纯互联网算法题往往要么是搜索推荐、要么是图像/文本处理而乐信这类公司更看重你对“风控”“信贷”“反欺诈”等业务场景有没有概念。所以如果你只是疯狂刷LeetCode忽略了机器学习基础考试时见到问答题会很吃亏。我当时就是因为复习阶段一部分精力放在推导常见模型公式上最后问答部分整体完成得比较顺。2. 数据结构与经典算法笔试的“基本盘”2.1 字符串题KMP的next数组不能只会背模板乐信这套卷子里出现了一道字符串匹配相关的题目给我印象挺深。它不直接问你“实现strStr”而是给了一个具体的模式串要你写出next数组并说明匹配过程。当时给的例子风格很像我们刷题时常见的“abacaba”这类串看起来简单实际动手一算才发现很多人会算错。KMP算法的核心是next数组我习惯把它称作前缀函数prefix function含义是对于模式串pnext[i]表示p[0...i]这个子串中最长的“相等前后缀”的长度。以pabacaba为例我手算一遍给你看i0子串a没有真前后缀next[0]0i1子串ab前缀a后缀b不相等next[1]0i2子串aba前缀a等于后缀a更长的ab不等于ba因此next[2]1i3子串abac前缀a不等于后缀cnext[3]0i4子串abaca前缀a等于后缀anext[4]1i5子串abacab前缀ab等于后缀ab长度2next[5]2i6子串abacaba前缀aba等于后缀aba长度3next[6]3。所以最终next数组就是[0,0,1,0,1,2,3]。这里有一个容易踩的坑很多教材里next数组的定义会往右移一位、首位置-1导致网上代码五花八门。笔试时不管用哪种定义都要在注释里写清楚不然面试官看你的手写推导会一脸懵。提示KMP真正难的不是求next数组而是理解“失配时模式串怎么跳”。next[i]意味着“匹配到i位置失败时下一轮直接用next[i-1]位置的字符继续比”跳的是相同前后缀而不是从模式串头重新开始。这个思想理解了字符串匹配就不怕变种题。2.2 排序与堆算法选择题和手写题的重灾区乐信这套卷子虽然没有直接让你手写快排但选择题里考到了“下列排序算法中哪些是稳定的”“堆排序建堆的时间复杂度是多少”这类基础题。很多人备战校招时喜欢直接刷hard题反而把排序算法这种“太基础”的内容扔在一边结果真考到了又说不清。我整理了一张表笔试前反复看几遍很管用排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n^2)O(n^2)O(1)稳定选择排序O(n^2)O(n^2)O(1)不稳定插入排序O(n^2)O(n^2)O(1)稳定希尔排序O(n^1.3)左右O(n^2)O(1)不稳定归并排序O(n log n)O(n log n)O(n)稳定快速排序O(n log n)O(n^2)O(log n)不稳定堆排序O(n log n)O(n log n)O(1)不稳定计数排序O(n k)O(n k)O(k)稳定这里重点说一下堆排序。手写堆排序的时候建堆过程和调整堆过程特别容易搞混。建堆是从最后一个非叶子节点开始往下调整也就是从 n/2 - 1 号位置往前遍历而排序阶段每次把堆顶和末尾交换然后对堆顶做一次向下调整。我当年写堆排序时有一次直接把建堆和排序两个循环写反了结果数组结果差之千里后来养成了一个习惯不管多熟悉的代码都要在本地跑几个随机用例验证。2.3 贪心、图论与动态规划编程题的主战场乐信这套笔试题的第二道和第三道编程题明显偏向贪心和动态规划。有一道题大概是给了一组区间要求选出尽可能多的互不重叠区间这就是经典的活动选择问题标准解法是贪心按结束时间排序依次选最早结束且与当前已选集合不冲突的区间。很多人一看到“最优解”就急着写DP其实这道题的贪心性质是可以证明的写起来也快很多。不过贪心题容易在证明上翻车。面试时如果只是写对了代码但说不清为什么贪心策略是对的面试官多少会打个问号。复习的时候可以准备几个常见贪心模型的证明思路比如区间调度、哈夫曼编码、最小生成树。Kruskal和Prim这两个MST算法也值得再多看一眼因为它们在金融场景里做聚类和网络分析时其实有间接应用。动态规划是另外一个大头。乐信第三道编程题有点像一个变种背包问题给定几个维度的约束条件求某些指标的最大化。这类题最怕一上来就想着优化空间结果状态定义都写错。我自己的经验是先用最朴素的方式定义dp状态和转移方程哪怕空间复杂度高一些先把核心思路跑通再考虑滚动数组或者状态压缩。笔试时间紧张一个能跑通但不够优秀的DP远比一个思路精妙却写不完的DP得分高。3. 机器学习与风控场景金融科技公司的“隐藏考点”3.1 机器学习基础聚类、KNN、模型评价那些必问题乐信的问答题部分有一道关于聚类算法的题目问的是K-Means和DBSCAN在解决什么类型的问题时更合适各自的缺点是什么。这类题没有标准答案考察的是你是否有真实的模型使用经验而不是只背概念。我当时的回答思路是K-Means适合凸形状、簇大小较均匀的数据需要预先指定KDBSCAN的优势在于可以发现任意形状的簇并且能识别噪声点但参数对结果影响很大高维数据下距离计算容易失效。另外问答题里还有一个关于KNN的问题问法很像网上常见的那句“KNN算法的应用能力包括哪三个方面”。从我的理解来看KNN第一个应用是分类这不需要多说第二个是回归取K个近邻的均值或加权均值作为预测值第三个是缺失值填补和推荐比如协同过滤里“找相似用户/相似物品”本质上就是在做K近邻搜索。这三个方面建议大家准备时都要能结合实际场景展开。注意这类基础算法题回答时要体现“场景”而不是只罗列特点。比如讲KNN可以说“在信贷申请数据里如果某个字段缺失我可以基于该样本的特征找出最相似的K个历史样本用它们在该字段上的众数或均值做填充这就是KNN在特征工程里的典型应用”。这样一写显得你是个真正做过项目的人。3.2 金融风控设计题从算法到业务逻辑的转换这套卷子的最后一道问答题分值最高大意是如何设计一个信贷风控逾期预测模型从数据、特征、模型、评估四个维度说明。这题我印象特别深因为很多同学只写“用XGBoost/LightGBM训练一个二分类模型”大量细节都没提到分数自然拿不全。数据层面需要约定观察期和表现期。比如用用户过去6个月的行为数据预测未来3个月内是否逾期这个时间窗口必须有定义否则模型的目标变量就是混乱的。特征层面常见的有用户的年龄、收入、职业等基础信息也可以从历史借款行为中衍生出“最近30天借款次数”“平均还款间隔”“历史最大逾期天数”等强特征。模型层面金融场景对可解释性有要求通常不会一上来就上深度模型而是先做逻辑回归/GBDT必要时再用模型融合。评估层面除了AUC和KS还要关注不同阈值下的精确率、召回率以及业务损失。我当时在答案里还写了一个容易被忽视的点样本不平衡。逾期样本通常远少于正常样本如果直接用原始数据训练模型容易把所有样本都预测为正常类。应对方式包括欠采样、过采样、调整样本权重、或者用更适合不平衡数据的评估指标比如召回率、F1、AUC。这些细节才是区分“刷题选手”和“真正做过算法”的关键。这里还想插一句热词里出现的“粒子群算法”“模拟退火算法”“PID算法”这类内容虽然很少直接出现在金融科技校招笔试的必答位置但作为知识储备是有价值的。如果在开放性设计题里让你优化某个规则组合或者确定超参数你在答案里提一句“可以尝试用粒子群或模拟退火做组合优化”会让面试官觉得你知识面广我当时就在其中一道题里提到了这类启发式算法思想效果还不错。4. 编程实现与工程细节从“会做”到“能跑过”4.1 边界条件和复杂度分析笔试挂掉的最大隐形杀手很多同学刷题的时候有这种经历题解看得懂思路清晰本地自测也对但一提交就是超时或者case过不了。最直接的原因通常是两个一个是边界条件没考虑全另一个是复杂度估算有偏差。乐信第三道编程题我一开始写了一个O(n^3)的版本跑样例没问题但提交后明显会超时因为数据范围暗示着需要O(n^2)甚至O(n log n)的解法。这里分享一个经验笔试看数据范围就能猜复杂度的量级。如果n是10^5左右O(n^2)基本会超时你得朝着O(n log n)或O(n)想如果n只有10^3那O(n^2)还可以接受甚至O(n^3)可能勉强能过。在文字题里评估算法复杂度也是常考的比如“堆排序建堆时间复杂度为什么是O(n)而不是O(n log n)”这类细节建议翻一下手算过程做到能推导而不是死记结论。边界条件的坑通常藏在空数组、单个元素、全相同元素、负数、极大值这些地方。比如字符串匹配题里模式串为空时应该返回什么区间问题里区间左端点等于右端点算不算有效区间DP题里dp数组初始化为0还是负无穷会直接影响结果。我自己的习惯是代码写完之后花2分钟在草稿纸上枚举3到5个极端用例再提交反正在笔试系统里多试几次也不浪费时间比自己默默改半天划算得多。4.2 手写代码的常见坑点与自测技巧手写代码和平时在IDE里写代码完全不是一回事没有自动补全也没有调试器写起来更容易暴露基础不牢的问题。我整理了一些自己踩过的、也见过别人踩的坑快排的partition函数里选pivot、双指针移动的先后顺序容易写乱。建议固化成一种写法考试时不要临场创新。DFS递归深度过大时改用显式栈或BFS。尤其是网格类搜索问题递归写法容易栈溢出笔试环境不一定允许你调整栈大小。使用全局变量或类成员变量时注意在每轮测试用例前重置。之前遇到过代码本地跑第一个用例正确第二个用例因为全局变量残留导致全错的情况。使用哈希表统计字符频率后最后忘了判断“长度不等”这种初始条件导致返回错误结果。溢出问题要用long long尤其是涉及乘法或者求和时int很容易爆。自测时还有一个技巧就是不要只测题目给的样例。我一般会自己生成几个随机小数据再写一个暴力解法做对拍。如果笔试环境允许本地写脚本用对拍方式验证自己算法的正确性非常可靠。正式笔试时虽然不能写完整对拍程序但可以在脑海里模拟暴力逻辑拿几个小数据手工跑一遍很多隐藏问题都能提前发现。5. 备考方向与现场应战技巧我是怎么复盘的5.1 在校招冲刺期我如何规划刷题优先级到了乐信笔试的时候我的刷题强度已经进入冲刺期。回头看我觉得有一个高效策略可以分享按题型重要性排序而不是按题号顺序刷。第一梯队是字符串处理、链表、二叉树、哈希表、堆栈队列这些属于“基本盘”必须熟练第二梯队是动态规划、贪心、图的最短路径和并查集这是拉开差距的部分第三梯队才是平衡树、线段树、数论、计算几何这些冷门内容校招笔试很少考有余力再看。机器学习部分也别裸奔。校招算法岗笔试里的机器学习题通常不会让你手推大段梯度公式更多是考概念、适用场景、优缺点。复习时建议按“聚类算法、分类算法、集成学习、模型评估、特征工程、风控场景”这几个模块准备每个算法都准备一段“项目应用”话术面试时也能用到。我在考前一周专门做了一件很有用的事把所有高频代码模板整理成文档比如二分查找、快排、归并排序、堆排序、二叉树遍历、KMP、Dijkstra、并查集、背包DP。每道模板题手写一遍并计时。笔试时遇到“面熟”的题直接用肌肉记忆写出来省下的时间都留给难题和问答题。提示刷题频率不需要一天十道关键是每天都要保持手感和算法思维。我在冲刺期每天只刷3到5道题但每一题都会在纸上写下状态定义、转移方程、复杂度分析再动手敲代码这样的效果比盲目刷20道题要扎实很多。5.2 考场上遇到没见过的题怎么办乐信笔试那天第三道编程题我一开始其实没看明白题意第一反应是有点慌但后来我强制自己冷静下来按三个步骤处理先重读两遍题目把输入输出格式和约束条件圈出来再把这个陌生问题往已知模型上靠比如它像不像背包问题、像不像区间调度、像不像最小生成树的变体最后实在想不出最优解就先写一个暴力解把部分分的case拿住。这种“先暴力后优化”的策略在校招笔试里非常实用。很多笔试系统是按case给分的暴力解哪怕只能过40%的样例也比空着强太多。而且很多时候写着写着暴力解里就能看出重复计算的位置顺理成章过渡到优化版本。我在乐信笔试里就是先写了一个O(n^2)的动态规划版本再逐步改成了能过全部样例的版本。问答设计题也是这样遇到不会的内容先把你知道的、相关的点都写上去用分点、分层的结构组织答案。笔试阅卷人看的是你的思维框架和表达能力不是单纯寻找唯一正确答案。当时那道风控题我只是把特征、模型、评估三个维度写清楚了就已经能拿到不错的分数。最后再分享一个小技巧笔试结束前如果还有5分钟一定要检查代码里所有输出语句的格式比如是不是多了空格、样例输出是不是需要保留两位小数。我在一次其他厂笔试里就是因为输出格式不对丢了不少分乐信这套卷子虽然没犯这种错但这种“最后一分钟”翻车的教训值得每个人记牢。算法岗笔试归根到底比拼的是“扎不扎实”和“稳不稳”把这八个字练好拿到offer只是时间问题。