1. 我们到底在考什么:一份来自2019年秋招的银行AI岗笔试题解
有些招聘笔试,考的是你会不会。招行信用卡中心的这场秋招IT笔试,考的是你有没有在真实业务场景里做AI的常识。2019年,这个岗位还叫“AI方向”,试卷上既有编译原理、计算机网络这类计算机基础,也有朴素贝叶斯、SVM这些机器学习算法,还夹着一堆银行信用卡业务相关联的场景题。两年后回看这份卷子,我最大的感受是:它能筛掉两类人——一类是只会刷LeetCode没碰过正经工程的,另一类是算法调包侠但根本不懂业务逻辑的。今天这篇,就当是给后来者的一份考古笔记,帮大家把题型、考点、答题节奏和备考陷阱一次性说透。
为什么值得写这份2019年的题?一来,招行信用卡中心的IT岗在银行系里偏向互联网风格,题型和BAT的中级算法岗相当接近,参考价值高。二来,AI方向笔试的第一批,往往意味着题型刚定型、难度试探性强,正是研究银行系对AI人才能力预期的样本。如果你正在准备银行系或金融科技公司的算法笔试,这篇能让你少走很多弯路。
2. 整体设计与思路拆解
2.1 这场笔试的定位:它不是一个纯算法考试
在看具体题目之前,需要先理解这场笔试的设计逻辑。金融行业的AI岗位,核心诉求从来不只是模型精度,而是风控、反欺诈、客户生命周期管理这些业务指标的落地。所以,笔试试卷在出题时,明显有意把“计算机基础素养”“机器学习理论”“工程实现能力”“业务场景理解”四个维度混在一起考。
整张试卷的时间是120分钟,题型分布大致是:单选、不定项选择、编程题、简答/方案设计题。其中选择题覆盖网络、数据库、操作系统、数据结构,编程题2到3道,AI相关的主观题3到4道。整体难度梯度是:基础知识占40%,算法与模型理解占35%,业务场景方案设计占25%。这个比例说明,寄希望于只靠刷题通过是不现实的,你必须有一个相对均衡的知识体系。
我当时拿到卷子后,快速浏览了一遍。第一感觉是:这绝非那种“纯背八股文”的银行旧式笔试,而是具备互联网公司风格的混合型试卷。换句话说,银行在招聘AI人才时,也开始要求候选人具备端到端的思考能力——从数据理解、特征工程到模型选型,再到业务指标评估。
2.2 设计者希望筛选出什么样的人
银行信用卡中心AI方向,核心工作是什么?简单说,就是用算法解决信用卡业务中的实际痛点。比如:申请反欺诈识别、交易欺诈实时检测、客户流失预警、额度策略优化、营销响应预测。这些场景和普通互联网推荐系统不同,它们对Precision和Recall的权衡更敏感,对模型可解释性要求更高,对误杀率的容忍度极低。
所以,笔试设计者希望在试卷中看到的能力包括:第一,扎实的计算机基础,确保候选人能处理大规模数据;第二,对机器学习模型本质的理解,而非只会调用sklearn;第三,面对模糊业务问题时,具备结构化分析和方案设计能力;第四,一定的编程落地能力,至少要能写出可运行的、边界处理完善的代码。这四个维度,就是整张试卷的“纲”。理解了纲,备考方向就不会跑偏。
3. 核心考点详解:计算机基础与机器学习理论
3.1 计算机网络:不止是三次握手
选择题部分,计算机网络是必考模块。招行这次考了TCP和UDP的区别、HTTP状态码含义、DNS解析过程。但千万别以为只是背概念,有一道题给出了一个信用卡APP交易超时的场景,让选择最可能的网络层原因。这个场景化出题方式,是银行笔试特色——它不问你“TCP保证可靠传输的机制有哪些”,而是放在一个具体的业务失败案例中,让你判断问题出在哪个协议层。
备考建议:把TCP三次握手、四次挥手、滑动窗口、拥塞控制这些核心机制真正理解,而不是背状态名。更重要的是学会用这些知识解释实际故障。比如:“为什么信用卡还款日当天APP卡顿严重?”答案可能涉及HTTP连接复用、数据库连接池配置、CDN命中率等,这些都在网络知识考察范围内。
3.2 数据结构与算法:难度不高,但边界条件是分水岭
本次编程题一共两道。第一道是“给定一个字符串,找出其中不含有重复字符的最长子串长度”,这是一道经典题,LeetCode中等难度。第二道是“设计一个数据结构,支持插入、删除、随机获取元素,且时间复杂度均为O(1)”。后者明显是LeetCode 380的变体。
第一眼看到这两道题,我心情有点复杂。简单,是因为都是常见题;难,是因为题量虽少,但边界条件要求极严。第二道题要求O(1)的随机获取,意味着必须用“哈希表+数组”的组合结构,删除时将最后一个元素交换到待删位置,再pop。很多人在这一步忽略了更新哈希表中的索引,导致提交后用例不过。这种题考察的不是你会不会做,而是你能否写出无懈可击的代码。
数据结构考察还出现在选择题里,比如:给出一棵二叉树的先序和中序遍历,求后序遍历;哈希冲突的解决方法;堆排序的时间复杂度稳定性分析。整体难度接近计算机考研,对于科班出身的同学压力不大,但对于非科班转AI方向的,这部分需要系统补课。
3.3 机器学习理论:模型细节是重头戏
机器学习相关题目是区分度最大的模块。选择题部分考了:朴素贝叶斯中拉普拉斯平滑的作用、SVM核函数的选择依据、随机森林与GBDT的区别、L1与L2正则化的本质差异。不定项选择还考了一道关于过拟合检测的题:给定一组训练集和验证集准确率曲线,判断哪几种措施可能有效。
简答题中有两道值得重点说。
第一道是:“请解释在信用卡欺诈检测场景中,为什么准确率不是合适的评估指标?你推荐哪些评估指标?为什么?”这道题考察的是对类别不平衡问题的理解。信用卡欺诈样本通常占比极低,如果模型把所有样本都预测为“正常”,准确率也可能高达99%以上,但这个模型毫无价值。正确做法是关注Precision、Recall、F1-Score,以及更能体现业务成本的AUC和KS值。此外,还需要说明在欺诈检测中,Recall通常优先于Precision,因为漏掉一笔欺诈交易的代价远高于一次误判。但过度追求Recall又会带来大量人工复核成本,因此实际落地时,会设定一个精确率底线,在这个约束下最大化召回率。
第二道是:“比较逻辑回归和XGBoost在银行信用评分场景中的优劣,你会如何选择?”这道题明显是在考察工程经验。逻辑回归的优点是可解释性强、训练快、在线推理性能好,在强监管的金融行业,模型解释性直接关系到合规审计。XGBoost的优势是能自动捕捉非线性关系、特征交互,精度通常高于逻辑回归。但它的缺点是调参复杂、推理耗时更高、可解释性较弱。在实际银行场景中,常用做法是“两者结合”:用XGBoost挖掘高潜力特征,再用逻辑回归做最终评分卡模型。这样既保证了效果,又保住了可解释性。
4. 实操过程与核心环节实现
4.1 编程题的答题策略与写码心得
编程题是笔试中最好拿分也可以最致命的部分。我当时拿到的是牛客网在线评测系统,支持Python、Java、C++,编译器无自动补全,代码需要手动输入。这意味着,平时习惯了IDE自动补全的同学,如果考前没有在OJ系统上练过手,很容易在简单题上翻车。
我的答题顺序是:先花5分钟把两道题都看一遍,评估难度,然后先做第二道数据结构设计题,再做第一道字符串题。为什么先做难的那道?因为考试刚开始时头脑最清醒,而且第二道题如果放到最后容易时间不够。事实证明这个决策是明智的——第二道题确实花了我20分钟调试,做完后心里有底,再做第一道就顺风顺水了。
第二道题的标准解法是:用ArrayList存储元素,用HashMap存储元素到索引的映射。插入时,先检查元素是否已存在,若存在返回false,否则直接add,并在map中记录索引。删除时,先获取待删元素的索引,将数组最后一个元素的值赋给待删位置,更新map中该元素的索引为待删索引,然后移除数组最后一个元素,并从map中移除待删元素。这样每一步都是O(1)。这个思路不难,但代码实现时容易在“边界情况”上出问题,比如数组为空时调用getRandom(),或者删除的元素恰好是最后一个元素。
以下是核心代码片段的参考实现,我当时是这么写的,实测能AC:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; public class RandomizedSet { private Map<Integer, Integer> indexMap; private List<Integer> values; private Random random; public RandomizedSet() { indexMap = new HashMap<>(); values = new ArrayList<>(); random = new Random(); } public boolean insert(int val) { if (indexMap.containsKey(val)) { return false; } indexMap.put(val, values.size()); values.add(val); return true; } public boolean remove(int val) { if (!indexMap.containsKey(val)) { return false; } int index = indexMap.get(val); int lastValue = values.get(values.size() - 1); values.set(index, lastValue); indexMap.put(lastValue, index); values.remove(values.size() - 1); indexMap.remove(val); return true; } public int getRandom() { return values.get(random.nextInt(values.size())); } }这段代码里有两个点值得注意。第一,在remove中,如果把最后一个元素换到待删位置后,map里原来记录的lastValue的索引必须更新,不然下次删除lastValue时会拿旧索引去定位,导致删除错误元素。第二,getRandom前必须确保values非空,系统测试用例可能会在空集合上调用getRandom,这时需要抛出异常或返回特定值。我在考试时,加了一个对values.isEmpty()的判断,返回-1,避开了一个险恶的测试用例。
4.2 设计方案题:怎样在有限时间给出结构化答案
简答题中有两道是开放式的方案设计,这是整张卷子中最能体现水平的题目。比如有一道:“如何设计一个信用卡交易反欺诈实时识别系统?请描述整体架构、关键模块和技术选型。”
针对这类题,我建议采用四段式的答案结构:数据层、特征层、模型层、决策层。先说数据层:实时接入交易流水,包括交易时间、金额、商户类别码、地理位置、设备指纹等;同时关联历史数据,包括用户历史交易习惯、最近异常记录、黑名单库等。数据存储在Kafka消息队列中,流处理引擎用Flink或Spark Streaming,离线数据用Hive或ClickHouse。再说特征层:特征是反欺诈模型的灵魂,需要构造时间窗特征(如过去1小时交易次数、过去24小时交易金额总和)、商户特征(如该商户历史欺诈率)、用户行为特征(如夜间交易占比、异地交易比例)。然后是模型层:通常采用分层模型,第一层用规则引擎拦截明确黑名单或异常操作,第二层用机器学习模型打分,可选用XGBoost或GBDT,对时效性要求高的子场景也可以使用逻辑回归。最后是决策层:输出欺诈概率,结合业务成本设定阈值,高于阈值的交易进入人工审核队列,低于阈值的交易放行。这里要特别说明,银行对实时系统的要求通常是P99延迟小于100毫秒,所以特征计算和模型推理都要考虑性能优化。
这类题目哪怕你对系统设计不够精通,只要把架构分层讲清楚,把每个模块的核心组件点出来,再补充一些工程细节(如特征存储用Redis还是HBase、模型用PMML还是ONNX部署),就能拿到不错的分数。最忌讳的是只写一个“用AI识别欺诈”,没有任何实质内容,那还不如不写。
4.3 选择题的时间分配策略
整张试卷120分钟,我的建议分配是:选择题+不定项选择控制在40分钟内,编程题控制在50分钟内,简答题控制在30分钟内。前30分钟先快速做完有把握的题,遇到卡壳的直接跳过并做标记,最后5分钟集中解决。不定项选择比单选要危险得多,多选、少选、错选都不得分,所以不确定的选项宁可不选,也不要冒险。比如题目问“下列哪些方法可以缓解过拟合?”如果对“Dropout”这个选项在卷积网络里的效果有顾虑,就不要勾选它,即使它实际上是对的。策略性放弃是拿高分的保障。
5. 常见问题与避坑经验:这些坑,我替你们踩过了
5.1 常见问题速查表
| 问题类型 | 具体表现 | 解决与避坑方案 |
|---|---|---|
| 编程题超时 | 数据结构设计题用List.remove(Object)导致O(n) | 始终用“末尾元素交换删除法”保证O(1),并同步更新map索引 |
| 编译环境陌生 | 牛客OJ不支持本地IDE常用的包引用 | 提前用牛客网模拟环境练习5-10道题,熟悉手动输入格式 |
| 简答题内容空洞 | 只写“用逻辑回归模型”没有展开业务逻辑 | 每个模型选择都补一句“为什么是这个模型+局限性是什么” |
| 评估指标选错 | 使用准确率作为不平衡分类问题的核心指标 | 涉及金融欺诈、异常检测等场景,优先写Precision/Recall/AUC/KS |
| 选择题时间超支 | 在某一不确定的不定项选择上纠结5分钟以上 | 不确定选项直接放弃,标记后跳过,全部做完再回头斟酌 |
5.2 关于备考的时间线和方法论
如果你现在离笔试还有一个月,应该怎么规划?我的建议是三条线并行。第一条线:计算机基础。以《计算机网络:自顶向下方法》和《数据结构与算法分析》为主,每天花1-2小时,快速过一遍核心章节,重点看网络分层、TCP、HTTP、哈希表、二叉树、排序算法。第二条线:机器学习基础。以《统计学习方法》和吴恩达的机器学习课程为主,重点是逻辑回归、SVM、决策树、集成学习、朴素贝叶斯,不仅要懂原理,还要能用一句话说清楚每个算法的优缺点。第三条线:编程刷题。每天2-3道LeetCode中等难度题,重点练习哈希表、双指针、动态规划和树相关题目,考试前一周切换到OJ系统模拟环境,训练手写代码的能力。
值得提醒的是:银行系笔试一般都有“性格测试”或“认知能力测试”环节,这部分不计入技术分,但会影响面试资格。实际经验是,这类测试没有标准答案,保持一致、不要前后矛盾即可。
5.3 技术之外的隐性考察点
笔试只是第一关,但透过笔试能看出招聘方的很多偏好。招行信用卡中心AI方向,从笔试风格来看,非常务实且贴近业务。这意味着,就算你笔试通过了,面试环节也一定会问业务场景问题。所以,在此提醒所有备考者:不要只刷题,要在准备笔试的同时,积累金融科技的业务认知。建议看三份材料:招商银行年报中关于金融科技的章节、支付宝风控技术博客的相关案例分析、以及《信用评分模型技术与应用》这本书。有了业务知识储备,你写方案设计题时就能多出几个维度的细节,这不是临时抱佛脚能补上的。
5.4 心态调整:做到“少即是多”
很多人在笔试前疯狂收集题库,恨不得把网上能找到的所有银行笔试经验包都过一遍。但实际考下来,你会发现真正决定成败的,是你对核心知识点的熟练度,而不是你刷了多少套题。我当年备考时,把重点压缩到10个核心知识点,每个都做到了“能默写、能推导、能举例”。事实证明,这套打法在考场上非常奏效,因为万变不离其宗,所有题目最终都在考察你对基础概念的迁移能力。
最后一个建议:把每一次笔试都当成一次学习机会,不要只盯着结果。笔试结束后,立即把不确定的题目记下来,回去查资料、搞明白。这套复盘方法,比盲目刷十套新题都有用。