春招、秋招折腾过的同学应该都清楚,银行IT笔试和互联网大厂的笔试完全是两种画风。互联网公司喜欢上来就甩几道 Hard 题,让你在“最优解”和“暴力解”之间反复横跳;银行系笔试则更像一次基础功底的大阅兵,考的是你平时有没有认真上课、有没有老老实实刷过基础题。我在2019年秋招时参加过招商银行信用卡中心的IT笔试,报名的是开发方向第二批,今天就把这次笔试的完整复盘写出来,从考点拆解、编程题思路到线上笔试的踩坑实录,都给后来人做个参考。
虽然是2019年的题目,但银行IT笔试的考点结构这几年相对稳定,尤其信用卡中心这种业务导向的技术部门,考察逻辑和知识面很有代表性。无论你是准备银行系、券商系还是其他金融机构的科技岗,这篇文章都有直接参考价值。
1. 招商银行信用卡中心笔试的项目背景与整体概况
1.1 为什么信用卡中心的IT笔试值得单独复盘
招商银行信用卡中心在银行体系里算比较特殊的存在,虽然是招行下属机构,但技术团队规模不小,业务系统涉及交易、风控、积分、账务、客户管理多个核心模块,所以招人时对开发岗的考察并不水。笔试环节主要用来筛掉基础不扎实的人,题目难度中等,但覆盖面非常广。
“第二批”这个信息也有点讲究。银行招聘常分批次组织笔试,第二批通常是补录批次,或者按照简历投递时间分批安排。和第一批相比,第二批题目会有部分重合,但也可能临时调整题型分布。我当时的情况是:同批次的同学反映,整体风格和第一批类似,只是编程题换了一两道。
笔试形式是线上笔试,用的是第三方在线考试平台,全程摄像头监控。考试时间大约100分钟,题型分为三块:计算机基础知识选择题、编程题、性格测试。选择题覆盖数据结构、操作系统、计算机网络、数据库、Java基础等;编程题一共两道,一道算法题、一道SQL题;性格测试不计分,但前后有少量重复题,用来测答题一致性。
所以如果你想报考这类岗位,备考重点其实很明确:计算机基础打牢,算法能解中等题,SQL必须熟练。下面逐块拆解。
1.2 笔试的筛选逻辑与岗位匹配度
银行开发岗笔试和面试是两轮筛选逻辑。笔试更像“资格赛”,目的是确认你具备计算机科班或自学同等学力的基本素养。题目不会出特别偏、特别难的,但会在细节上做文章。
举个例子,选择题里可能出现:“HashMap在JDK1.8中,当链表长度达到多少时转红黑树”。这种题在业务开发里不一定要背,但笔试会考。为什么?因为银行技术栈中Java是大头,开发和维护需要候选人看懂底层机制,不只是会用API。
另外,SQL题基本必考。信用卡中心每天处理大量账务、交易流水,关系型数据库是核心基础设施。笔试考SQL不是故意刁难,而是这部分能力入职后马上就会用到,所以必须在笔试阶段筛选。
清楚了这个逻辑,备考的优先级就很明确:Java基础 > 数据结构与算法 > 数据库 > 操作系统/计算机网络 > 其他。
2. 开发方向笔试核心考点拆解:各大知识板块怎么准备
2.1 数据结构与算法:难度不高,但熟练度要求高
银行笔试算法题很少出Hard,一般集中在数组、字符串、链表、二叉树、栈、队列这些基础结构上。我那次的两道算法题难度基本对应LeetCode Easy到Medium之间,但如果刷题量不够,时间会非常紧张。
建议准备时重点练这几类:
- 字符串处理类:反转、回文、子串匹配、字符统计。
- 链表操作类:反转链表、合并链表、找环入口。
- 二叉树遍历类:前中后序遍历、层序遍历、二叉树深度。
- 排序与查找:快排、归并、二分查找。
- 动态规划入门:背包问题、斐波那契、爬楼梯,这类题出现频率稍低,但偶尔会有一道。
笔试算法题和面试算法题有一个重要区别:笔试看结果,面试看过程。在线笔试时没有人和你讨论思路,只有提交代码、跑用例、判分。所以平时练习一定要养成“一次写对”的习惯,尤其是边界条件,比如空数组、链表只有一个节点、字符串里有空格等。
2.2 计算机网络与操作系统:核心概念反复考
这两个板块在选择题里占比不小,但考来考去就那么几个考点。
计算机网络高频考点:
- TCP三次握手状态变化和SYN攻击原理。
- HTTP状态码含义,尤其是301、302、403、404、500。
- TCP与UDP区别,TCP粘包问题。
- DNS解析过程。
操作系统高频考点:
- 进程和线程的区别,以及它们的通信方式。
- 死锁产生的四个必要条件(互斥、请求与保持、不可剥夺、循环等待)。
- 常见页面置换算法,LRU、FIFO等。
- 用户态和内核态的切换场景。
这些知识点刷一遍并不难,难的是记牢、选对。建议把计算机网络和操作系统做成“速记卡片”,考前一周每天过一遍。
2.3 数据库与SQL:银行笔试的必争之地
信用卡中心的业务是和账户、流水、账单打交道的,数据库重要性不用多说。选择题里会考:事务的ACID特性、隔离级别(读未提交、读已提交、可重复读、串行化)、索引失效场景、三大范式。
SQL编程题一般是一道JOIN查询,或者带条件的聚合查询。比如题目会给两张表:用户表和交易表,要求统计每个用户的消费总金额/消费次数,筛选出超过平均值的用户等。这种题型在牛客网的SQL题库里非常多,练熟了基本能cover。
我之前遇到过一道SQL题,大致是:给定交易表,查询2019年每个月消费金额排名前三的用户。这种“分组取Top N”的题目,核心是用窗口函数,或者用自连接+COUNT统计比当前值大的数量。但要注意,银行笔试的SQL环境不一定支持窗口函数,所以最稳的做法是掌握“JOIN + GROUP BY + HAVING”的写法,窗口函数作为加分项。
2.4 Java基础与编程语言:占比最高的选择题板块
招行信用卡中心开发岗肯定以Java为主,选择题里Java占比相当高。考察内容集中在以下几个方面:
- 集合框架:ArrayList和LinkedList区别、HashMap底层原理、HashSet如何保证不重复。
- 并发基础:synchronized和Lock区别、volatile作用、线程池参数含义。
- JVM:内存区域划分、GC参数、类加载过程。
- 面向对象:重载和重写区别、接口和抽象类区别、静态绑定与动态绑定。
如果你平时用C++或者Python刷题,考前也要专门过一遍Java基础题。不需要全部掌握,但至少能应付选择题。我当时也踩过这个坑:习惯用C++写算法,结果Java集合底层的题只能靠蒙,后来面试问JVM时又追问了一轮,差点翻车。
3. 编程题实操复盘:三道典型题目与完整解题思路
3.1 编程题的类型分布与答题节奏策略
2019年那次第二批笔试的编程题一共是三道:两道算法题,一道SQL题。但因为不同批次的题目可能存在卷型差异,我按考场上实际见到的题型来复盘,同时给出通用的解题思路,方便你迁移。
先说答题节奏。100分钟包含选择题、编程题和性格测试,时间其实偏紧。我的策略是:先快速跳过拿不准的选择题,用5到8分钟把编程题看完,动手先做有思路的编程题,回头再补选择题。因为选择题一道也就1到2分,而一道编程题动辄20到30分,这个权重差异决定了策略。
另外,编程题支持的语言我当时用的是C++和Java两种,原则上选择自己最熟的语言就行。但要注意输入输出格式,银行笔试平台一般从标准输入读流式数据,输出结果到标准输出,不需要做文件IO。
3.2 第一题:字符串按出现次数排序(Easy-Medium)
题目大意:输入一行字符串,要求按字符出现次数降序输出字符;如果出现次数相同,按字符原本字典序升序输出。
例如输入"abacc",输出"aaccb"或"aacbc"(不同实现可能顺序略有差异,以题目要求为准)。
思路拆分:
- 第一步用哈希表统计每个字符出现次数。
- 第二步需要按次数排序,同时相同次数按字符序排序,所以可以构造一个pair,第一维是次数,第二维是字符,使用自定义排序。
- 第三步按照排序结果拼接字符串。
C++参考实现:
#include <bits/stdc++.h> using namespace std; int main() { string s; cin >> s; unordered_map<char, int> mp; for (char c : s) mp[c]++; vector<pair<int, char>> vec; for (auto& p : mp) vec.push_back({p.second, p.first}); sort(vec.begin(), vec.end(), [](pair<int, char>& a, pair<int, char>& b) { if (a.first != b.first) return a.first > b.first; return a.second < b.second; }); string res = ""; for (auto& p : vec) res.append(p.first, p.second); cout << res << endl; return 0; }这段代码的核心是sort的lambda自定义排序,另一个容易被忽略的是string.append接口,可以一次性追加n个字符。如果你用Java写,用StringBuilder的循环append即可。
这类送分题切忌失误,常见扣分点有:没有处理字符串为空的情况、统计时用了数组但没考虑大小写混合、排序规则写反导致部分用例过不了。
3.3 第二题:二叉树的层序遍历(Medium)
题目大意:给定一棵二叉树,输出它的层序遍历结果,要求每一层单独一行,行内用空格分隔。
思路拆分:
- 层序遍历最自然的做法是使用队列,广度优先搜索。
- 需要知道当前层的节点数量,所以每次进入循环时先记录
queue.size(),这个值就是当前层的节点数。 - 遍历当前层的同时把下一层节点入队。
C++参考实现:
#include <bits/stdc++.h> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> res; if (!root) return res; queue<TreeNode*> q; q.push(root); while (!q.empty()) { int n = q.size(); vector<int> level; for (int i = 0; i < n; i++) { TreeNode* node = q.front(); q.pop(); level.push_back(node->val); if (node->left) q.push(node->left); if (node->right) q.push(node->right); } res.push_back(level); } return res; }很多同学写层序遍历时会忘记“记录当前层节点数”,直接用while(!q.empty())输出,结果所有节点被打印成一行,这就是低级的0分失误。面试时如果让你白板写层序遍历,这个点也会被重点考察。
3.4 第三题:SQL分组Top N查询
题目大意:给定交易流水表transactions,字段包括user_id、trans_date、amount,表数据如下:
| user_id | trans_date | amount |
|---|---|---|
| 001 | 2019-01-05 | 100 |
| 002 | 2019-01-08 | 200 |
| 001 | 2019-02-11 | 300 |
要求查询每个用户消费总金额,并按消费总金额降序返回前三名。
思路拆分:先按user_id分组求SUM(amount),然后按总金额排序,最后用LIMIT 3限制。
MySQL参考写法:
SELECT user_id, SUM(amount) AS total_amount FROM transactions GROUP BY user_id ORDER BY total_amount DESC LIMIT 3;这里有一个细节:如果分组里有金额相同的用户,是否需要并列排序?题目通常要求严格的排序,不会涉及并列,所以LIMIT写法足够。但如果是“按月份取每月消费金额前三的用户”,就需要子查询:
SELECT user_id, trans_month, total_amount FROM ( SELECT user_id, DATE_FORMAT(trans_date, '%Y-%m') AS trans_month, SUM(amount) AS total_amount, ROW_NUMBER() OVER (PARTITION BY DATE_FORMAT(trans_date, '%Y-%m') ORDER BY SUM(amount) DESC) AS rnk FROM transactions GROUP BY user_id, DATE_FORMAT(trans_date, '%Y-%m') ) t WHERE rnk <= 3;建议两种写法都熟练,窗口函数在MySQL 8.0之后是支持的,但有些银行笔试系统可能用的是MySQL 5.7,所以第一种写法必须会。
3.5 在线笔试环境与提交的细节坑
笔试平台的坑比想象中多。我当时用的平台是牛客网风格的在线编译环境,本地IDE能跑的代码,粘贴上去后可能出现两个问题:一是编译器版本不同导致C++标准库引用报错,二是输入格式存在换行符不一致问题。
建议提交前做三步检查:
- 头文件是否齐全,C++建议直接用
#include <bits/stdc++.h>,省去遗漏。 - 是否读了多组输入。有些题目表面是一组输入,实际上会循环输入到EOF,如果没写循环只过部分用例。
- 数组和变量类型是否可能溢出。比如题目给的数据范围可能超过int,求和时要用
long long,否则大用例直接WA。
4. 笔试备考时间规划与应试策略:从零开始的高效路径
4.1 备考时间线:一个月到两个月是合理区间
银行笔试内容多、杂、但单点难度不大,所以备考的关键不是拼深度,而是保证宽度。我建议至少提前40天开始准备,太长容易疲惫,太短容易遗漏。
- 第1周:过一遍数据结构与算法核心知识点,同时刷LeetCode的数组、链表、字符串标签下的Easy题,目标是每天3到5题。
- 第2周:重点攻二叉树、DFS/BFS、排序,同时穿插复习Java集合和并发基础选择题。
- 第3周:开始刷SQL题,每天5到8道,把牛客网的SQL入门到进阶题库过一遍。同时复习计算机网络和操作系统高频考点。
- 第4周:进入模拟笔试阶段,用牛客网的银行历年真题卷限时100分钟,每周做2到3套。
- 第5到6周:针对错题查漏补缺,重点练自己不熟的知识点,考前三天只看错题和速记卡片。
这个计划适合计算机基础一般、平时有刷题习惯但不系统的同学。如果你平时算法练得少,可以把刷题时间拉长到每天5题以上,并优先刷高频题。
4.2 刷题工具与题单推荐
当年我用的刷题工具是LeetCode加牛客网,这个组合到今天依然好用。银行笔试的选择题和SQL题在牛客网上的覆盖度最高,而算法题在LeetCode上练手感更合适。
推荐的题单:
- LeetCode Hot 100(只刷Easy和Medium,Hard看情况忽略)。
- 剑指Offer原题,尤其里面的链表、二叉树、字符串题。
- 牛客网“名企校招笔试真题”模块,搜索“银行”或“招行信用卡”,可以直接看到往年真题。
- SQL专项:牛客网SQL题库,从简单到困难按顺序刷完前80题。
一个技巧:每道题做完后,在笔记本上写一行总结,标注核心思路和时间复杂度。不要只刷题不总结,否则过两周就全忘了。
4.3 银行笔试行测题与性格测试怎么应对
有些银行笔试会混入行测题,比如言语理解、数量关系、逻辑推理、资料分析。招行信用卡中心那场也有类似板块,但不计入技术岗总分,或者占分很低,所以我当时没有花太多时间准备。
但有两类题不能完全忽略:性格测试和认知能力测试。性格测试虽然不计分,但后台会做一致性分析,如果前后矛盾太多会被标记。认知能力测试里偶尔会出现“图形推理”、“找规律”类题目,这类题考察反应速度,建议提前了解一下题型,不至于现场发懵。
我的建议是:行测题只做会做的,不会的快速蒙一个,把时间留给后面的编程题和Java选择题。
4.4 考场上的时间分配技巧
100分钟说长不长,说短不短,分配不合理很容易翻车。我当时的分配方案是:
- 开考前2到3分钟打草稿,先浏览所有题目,把选择题明显不会的标出来,不要在单个题上停留超过2分钟。
- 选择题部分控制在40分钟以内,剩下60分钟给编程题。
- 编程题先做有思路的,再做不太确定的。每道题限时25分钟,如果25分钟没写出来,先提交一部分用例的分,不要死磕。
- 最后预留5分钟检查代码是否编译通过、是否有明显边界漏判。
5. 实战避坑与问题排查实录:那些考场上才发现的坑
5.1 最容易丢分的三个低级错误
笔试最大的敌人不是题目难,而是低级失误。我复盘了自己和同批次同学的失误,以下三类最常见:
第一,本地运行正常,提交后0分。原因通常是输入输出格式问题。很多同学平时习惯自己定义输入数据测试,没有严格按照题目要求的输入格式写循环读取。遇到多组数据的情况,需要用while(cin >> s)或while (cin >> t)读入,而不是只读一次。第二,Java主类名写错。在线笔试平台一般要求主类名为Main,如果写成public class Solution,直接编译失败。这个错误非常可惜,属于白送0分。第三,变量类型溢出。题目告诉你在10^9以内,但中间结果可能是10^9乘以数组长度,超出int范围,用int存储就会WA。C++中建议直接使用long long。
5.2 线上笔试环境准备与突发情况处理
线上笔试最怕的不是题目难,而是设备出问题。
我当时专门做了三件事:
- 提前一天用考试平台提供的模拟测试链接检测摄像头、麦克风和浏览器兼容性。
- 准备一个有线网络加一个手机热点,万一主网络断掉,可以快速切换。
- 把电脑调成免打扰模式,关闭所有弹窗软件、即时通讯软件,避免考试中途被打断。
即便如此,考场还是可能出幺蛾子。我同批次有同学考试中途跳出一个系统更新提示,导致考试页面失去焦点,被系统判定为切屏警告。所以强烈建议提前关闭Windows系统更新通知、QQ、微信等一切可能弹窗的程序。
如果考试过程中确实断网,不要慌,第一时间截图保存现场,联系考试平台客服或招行校招组报备,一般会安排重考或者补时,关键是不要自己乱操作关闭浏览器。
5.3 如何获取往年真题和考点信息
有很多同学问政哪里找银行笔试真题。除了牛客网,其实有两个渠道容易被忽略:
一是应届生求职论坛的笔试汇总帖。每年秋招季,很多热心同学会在论坛上发布“刚刚考完,题目回忆版”,包括选择题考点、编程题大意和SQL题目结构。这些信息时效性极强,建议在笔试前一周集中刷一遍当年的回忆帖。
二是招商银行信用卡中心自己的招聘公众号或宣讲会。有些年份HR会在宣讲会或在线答疑时透露笔试考纲范围,比如“以Java和数据结构为主”、“包含SQL题目”等。这些信息虽然不精确,但能帮你确认备考大方向。
5.4 笔试与后续面试的关联性
银行笔试往往不只是筛选门槛,笔试成绩和考试记录会被面试官看到。我当时面试时,面试官就提到了笔试中的SQL题,问我“当时那题你是用窗口函数做的吗?”这说明面试官手里的材料是包含笔试答题记录的。
所以笔试答题时尽量用清晰、标准、可解释的写法。即使题目AC了,如果代码写得像“天书”,面试官追问时也不好解释。反之,如果代码注释清楚、思路清晰,会给面试官留下更好的印象。这个细节很多人不知道,但对后续流程有实际影响。
6. 银行IT笔试与互联网笔试的差异总结
最后再用一张表把银行系和互联网系笔试的差异拉出来,帮你判断自己更适合哪种复习节奏:
| 对比维度 | 银行IT笔试 | 互联网大厂笔试 |
|---|---|---|
| 算法难度 | Easy到Medium为主 | Medium到Hard常见 |
| 考点范围 | 计算机基础+Java+SQL | 算法+系统设计为主 |
| 题目类型 | 选择题比例高 | 几乎全是编程题 |
| SQL占比 | 必考且占分高 | 很少直接考SQL |
| 时间压力 | 中等,但选择题耗时间 | 压力大,算法题耗时间 |
| 面试关联 | 笔试记录面试时可能被追问 | 面试时主要看简历和手撕代码 |
如果你是一个算法竞赛背景强、但基础概念不够扎实的人,银行笔试反而比互联网笔试更需要注意,因为选择题没有AC一说,错了一道就是扣分。如果你平时做业务开发、Java基础扎实,银行笔试会相对顺手,算法只要保持手感就行。
我个人在实际操作中的体会是:银行系科技岗的笔试是“性价比”很高的筛选机制,它不追求区分度拉满,而是把所有必备技能都摆在台面上考一遍。备考时你去追那些偏题难题,收益很低;把高频考点吃透、把SQL写熟练、把常见算法模板背到条件反射,基本就能稳过。最后分享一个小技巧:考前一周把HashMap、线程池、JVM内存区域、TCP三次握手、四种事务隔离级别这五个专题做成一张A4纸速记表,每天早起过一遍,进考场前再看一眼。银行笔试考来考去,始终绕不开这些最核心的东西。