
看到“恒生公司2016研发工程师笔试卷”这个标题估计不少人第一反应是2016年的老题现在还能有什么参考价值我的答案是太有参考价值了。恒生电子是典型的金融IT公司给券商、银行、基金公司做核心交易与清算系统这类系统的特点是“不能错、不能挂、不能慢”。所以这套卷子的出题逻辑和普通互联网公司有非常明显的区别它不是考你会不会写代码而是考你有没有能力在“稳定压倒一切”的金融系统里干活。我自己在准备这类笔试时最大的感受是题目本身不算偏但知识覆盖面非常广基础概念的密度很高而且很多题目会把你往真实业务场景上引。你光会写排序算法不够还得知道数据库在并发写入时怎么保证不丢数据知道交易系统为什么必须用TCP而不是UDP知道线程死锁在什么场景下真的会炸。这篇文章不打算去猜具体的“原题答案”而是把这类卷子的考点拆开揉碎讲清楚每一类题在考什么工程能力以及怎样准备才能真正拿分。无论你目标是恒生还是其他做金融系统的公司这套分析思路都通用。1. 先弄清楚这套笔试卷的整体设计逻辑1.1 金融IT公司笔试和普通互联网公司的差异普通互联网公司的研发笔试很多是“算法定生死”数据结构与算法占比可以到百分之六七十题目难度往往拉得很高有时候甚至会出现一些偏技巧、偏脑筋急转弯的题本质是在筛“思维敏锐度”。但恒生这类金融IT公司不是这个思路。它面对的是券商、银行、基金公司这些客户对系统最核心的要求是稳定其次是数据安全然后才是性能上的极致优化。毕竟系统里跑的是真金白银一次对账不平就是业务事故一次接口超时可能造成用户投诉甚至监管问题。所以在2016年的笔试卷上你会看到一个很典型的现象知识点分布极其均匀数据结构、算法、数据库、操作系统、计算机网络、编程语言基础几乎一个都不能少。面试官想通过笔试筛选出的候选人不是某一方面的偏才而是“基础扎实、知识面完整、有工程风险意识”的人。这个逻辑放到今天依然成立因为金融IT行业的本质没有变系统对稳定性和数据一致性的要求没有变笔试的底层逻辑自然也不会变。1.2 2016年这套卷子的结构推测与考察权重虽然没有官方版本完整流出但结合当年金融IT校招笔试的普遍形式这套卷子大概率由三部分组成。第一部分是选择题和判断题覆盖内容很杂包括数据结构、网络、操作系统、数据库、Java语言基础主要用来快速筛掉基础不牢的候选人。第二部分是简答题比如解释一个概念、描述一个协议流程、写一段SQL或者给一个业务场景让你分析。第三部分是编程题通常一到两道要求手写代码或者至少写出完整的算法思路和关键步骤。从考察权重上看数据结构与算法肯定是大头但数据库的占比会明显高于普通互联网公司。操作系统和网络也占了相当比例尤其是进程线程、死锁、TCP状态这些和“可靠系统”直接相关的点。编程语言方面以Java为主因为恒生很多核心系统都是Java技术栈但C/C的基础知识也会偶尔出现尤其是指针和内存相关的内容。如果非要给一个大致比例数据结构算法35%、数据库20%、操作系统15%、网络15%、语言基础15%比较接近实际分布。掌握这个权重之后你就知道备考时应该往哪个方向猛攻而不是把时间平均花在所有地方。2. 数据结构与算法重头戏里的“送分题”和“丢分题”2.1 为什么金融IT比普通业务更看重数据结构基础很多业务系统的开发说白了是对数据的搬运和展示所以有些公司笔试可以只考算法。但金融系统里数据结构无处不在。交易系统的委托队列是典型队列行情快照排序要依赖排序算法风控系统里的账户与用户关系是树形结构资金账户的快速查询要求O(1)级别的查找效率。可以说数据结构的掌握程度直接决定了一个人能不能写出高效率、低延迟的金融组件。另外算法题在笔试里是最好的“区分度工具”。选择题和简答题背一背也许能混过去但编程题必须真刀真枪地写代码。面试官能从你的代码风格、边界处理、异常分支里看出你平时到底写不写代码是真正理解还是只会背诵概念。比如一道“反转链表”看起来简单但能把递归版本和迭代版本都写清楚、还能说出各自空间复杂度的人基本功一定不差。2.2 高频题型实战拆解第一类是线性表相关。链表反转、判断链表是否有环、合并两个有序链表、找链表倒数第K个节点这些题几乎年年出现。解题时强烈建议先画图把指针指向变化画清楚再去写代码能避免大量边界错误。比如反转链表时至少要定义三个指针pre、cur、next每次循环先用next保存cur的下一个节点再让cur指向pre最后三个指针整体后移。这个过程中最容易漏的就是第三步一旦漏了链表就断了。数组方面常考去重、旋转数组查找、双指针求和。这类题的重点是考虑空数组和只有一个元素的极端情况。第二类是栈、队列与字符串。用两个栈实现一个队列、括号匹配、最小栈、字符串反转、最长无重复子串这些题目出现频率很高。答这些题时要先说明数据结构特性再动手比如“栈是后进先出队列是先进先出”把思路讲清楚。用两个栈实现队列的经典思路是一个栈专门负责入队另一个栈专门负责出队出队时如果出队栈为空就把入队栈的所有元素倒过来。这样每个元素最多被移动两次均摊时间复杂度是O(1)。第三类是树与堆。二叉树的前中后序遍历、层序遍历、最近公共祖先、判断平衡二叉树这些都是老面孔。堆主要出现在Top K问题里比如“从海量数据中找出最大的K个数”用堆是最优方案因为维护一个大小为K的小顶堆时间复杂度是O(n log K)而如果直接排序复杂度是O(n log n)。写代码时递归实现遍历很简单但要能说出递归的栈空间复杂度是O(h)h是树高如果让你写非递归版本很多人就卡住了所以考前务必把非递归前序、中序、层序遍历都练熟。第四类是排序与查找。快排、归并、堆排序这三兄弟是必会的不只要会写还要知道各自的时间复杂度、空间复杂度、稳定性。快排平均O(n log n)、最坏O(n²)不稳定归并稳定但需要O(n)额外空间堆排序不稳定但空间复杂度是O(1)。二分查找更是送分题每年都有人栽在边界条件上比如用left right还是left right以及更新时是mid - 1还是mid。这个细节一定要自己推演一遍不能只背模板。下表是我总结的高频题型与核心考察点可以直接用来做自检清单题型典型题目核心考察点线性表链表反转、合并有序链表指针操作、边界处理栈队列双栈实现队列、括号匹配数据结构特性、逻辑设计字符串最长无重复子串、反转字符串滑动窗口、下标控制树层序遍历、最近公共祖先递归与队列使用堆Top K、合并K个有序链表堆性质、复杂度分析排序查找快排、堆排、二分查找稳定性、边界条件、复杂度2.3 答题的拿分技巧笔试卷子不是现场面试没人听你口头解释所有思路都要体现在文字和代码里。如果编程题写不出来完整代码建议先写清楚算法步骤再写核心伪代码哪怕只能写出关键的几行也能拿到部分分数。在我参与过的笔试阅卷里阅卷人最怕看到空白最不怕看到有思路但实现不完整。一道满分10分的编程题只要你有清晰的算法步骤和正确的主要逻辑通常能拿到4到6分这比完全空着强太多。另外无论题目是否要求都要在代码里考虑空值、越界、重复元素、大数溢出这些边界条件。比如反转链表时先判断head null || head.next null二分查找时用mid left (right - left) / 2防止整型溢出。一个能在边界处理上写两行注释的候选人给面试官的印象远比只写出主流程的人好。这些小细节平时刷题时就要刻意养成习惯考场上是来不及临时想的。3. 数据库笔试中性价比最高的部分3.1 索引、事务、SQL三分天下恒生这类金融IT公司的数据库考题很少考纯粹的背概念而是把概念放进场景里考。索引是第一个重头戏。B树为什么适合做索引、聚簇索引与非聚簇索引的区别、最左前缀原则、覆盖索引、索引失效场景这些点不是背结论而是要在碰到具体SQL语句时能判断“这条查询能不能走索引”。比如一张订单表上建了联合索引(user_id, order_time)查询条件同时包含这两个字段时能命中索引如果只查order_time就无法命中因为在联合索引里最左列没出现无法走最左前缀规则。再比如对索引列使用函数或隐式类型转换也会让索引失效。事务是第二个重头戏。ACID四个特性必须能解释清楚尤其是一致性和隔离性的关系。隔离级别有读未提交、读已提交、可重复读、串行化分别解决脏读、不可重复读、幻读问题MySQL默认的InnoDB隔离级别是可重复读。再往上一点会考MVCC和锁机制比如行锁、表锁、间隙锁、死锁的成因与避免方式。金融系统对数据一致性要求极高事务相关题目答得好不好直接反映你有没有“数据安全”这根弦。举个经典例子转账时扣款成功但入账失败如果没有事务保证原子性整个系统就瘫痪了。这种场景在金融日常业务里几乎天天发生在考卷上。3.2 金融场景下的数据库考法2016年的卷子里简答题和编程题不会直接写“请解释事务”而是常常包装成业务场景。比如转账过程中账户扣款成功但充值失败怎么办这考察的就是事务的原子性以及事务回滚机制。再比如交易流水表数据量极大查询某个用户最近十笔交易越来越慢你如何优化这种题考察的是索引设计和分库分表的基本思路。答这类题的正确姿势是“先定位问题再讲方案最后给权衡”。拿查询慢这个例子来说第一步说明可能的原因数据量大、缺少合适索引、查询语句写法有问题。第二步给方案先加联合索引(user_id, trade_time)再看是否可以用覆盖索引减少回表数据量实在太大时按用户ID分表或按月分表。第三步讲权衡加索引会降低写入性能分表会增加查询逻辑复杂度需要根据业务实际情况选择。金融场景里不能只求快还要考虑一致性和可回滚性比如分表后如何保证跨表查询和事务这些都是可以在答案里展开的点。3.3 SQL题怎么答才不丢分SQL编写题是必考的常见的有查每个部门工资最高的员工、统计连续3天登录的用户、查询购买金额超过平均值的订单。这种题要得分第一个要求是语法正确尤其是GROUP BY和HAVING的配合。记住一个核心口语化结论WHERE是在分组前过滤行HAVING是在分组后过滤组。第二个要求是考虑NULL值比如COUNT(列名)不会统计NULL而COUNT(*)会统计所有行这两个写在结果可能不一样。第三个要求是注意多表连接时不要漏掉关联条件否则会产生笛卡尔积导致结果爆炸。举个例子查每个部门工资最高的员工一种写法是先用子查询查出每个部门的最高工资再与原表连接取员工信息另一种思路是用窗口函数ROW_NUMBER() OVER(PARTITION BY dept_id ORDER BY salary DESC)查出来序号为1的就是工资最高的人。2016年的时候窗口函数可能还不是主流解法但能写出来绝对是加分项。写SQL前先说出你的逻辑哪怕语法有小错阅卷人也会认为你思路在线。另外我自己的经验是SQL题一定要在草稿纸上先画出表结构标清关联字段再动手写这样能有效避免因为表名、列名看错而白写一大段。4. 操作系统与网络稳定性思维的主场4.1 进程线程与并发题目怎么答操作系统在金融IT笔试里的地位是由“高并发”三个字决定的。交易系统同一时间要处理大量客户的委托和查询线程模型、锁机制、死锁处理都是日常。常考的点有进程和线程的区别、线程切换开销、进程间通信的几种方式、死锁的四个必要条件、如何避免死锁、用户态和内核态的区别、虚拟内存的作用。这些题目得分的关键是举例。比如解释死锁必要条件时不要只背“互斥、占有且等待、不可抢占、循环等待”而是举一个两个线程互相持有锁的代码例子线程A持有锁1请求锁2线程B持有锁2请求锁1两个线程都在等对方释放谁也无法推进这就是死锁现场。解释避免死锁时可以讲一个实用技巧所有线程按固定顺序加锁比如都先加锁1再加锁2循环等待就不存在了。用实际例子支撑的答案在阅卷人眼里才是真正理解而不是死记硬背。另外进程间通信方式是选择题和简答题的常客。管道、消息队列、共享内存、信号量、Socket这几种方式最好能横向对比。比如管道适合父子进程或有亲缘关系的进程数据以字节流形式单向传递共享内存效率最高但需要信号量配合解决同步问题Socket可以跨机器通信金融系统里的分布式服务通信都是基于这个原理。答这种题时如果能提到“交易系统的订单撮合服务之间一般用消息队列解耦”就比单纯列举概念高一个层次。4.2 网络题的高频问法与答题套路网络部分的高频考点集中在传输层和应用层。TCP三次握手为什么是三次而不是两次、四次挥手为什么是四次、TIME_WAIT为什么存在、TCP和UDP的区别、滑动窗口和拥塞控制、HTTP的GET和POST区别、HTTPS的握手大致流程、常见状态码的含义。还会有一道综合题在浏览器输入一个网址到页面展示中间经历了什么。这道题可以从DNS解析、TCP连接、HTTP请求、服务器处理、响应返回、浏览器渲染几个环节展开能写多细就写多细。我特别想提醒的是网络题不要只答结论。比如问“TCP和UDP有什么区别”很多人就写“TCP可靠、UDP不可靠”这个答案只能拿一半分。你还要补充TCP有连接状态、有序、重传、流量控制和拥塞控制UDP无连接、头开销小、传输延迟低、适合实时音视频。最好再结合金融场景说一句交易指令必须走TCP保证不丢实时行情推送可能用UDP降低延迟。这样答案的层次就完全不同了。再比如HTTPS握手很多人只记得“有CA证书验证”如果能展开成三步——客户端验证证书合法性、双方协商对称加密密钥、之后用对称加密通信——分数会明显高出一截。5. 编程语言基础Java为主C/C为辅5.1 Java考察的知识点图谱恒生很多核心系统都是Java开发的所以笔试卷里Java相关的题目占比不低。考察范围一般包括面向对象三特性封装、继承、多态以及接口和抽象类的区别字符串相关String、StringBuilder、StringBuffer的区别集合框架ArrayList和LinkedList的区别、HashMap的底层原理、HashSet如何保证元素不重复异常机制受检异常和非受检异常的区别多线程synchronized和Lock的区别、volatile的作用、线程池的参数含义JVM内存区域划分、类加载过程、垃圾回收算法。对2016年的卷子来说HashMap原理出现的概率极高。虽然当时的Java版本和现在不完全一样但核心考点一致底层数组加链表、为什么容量是2的幂、何时扩容、hash冲突怎么解决。容量是2的幂是为了让hash (capacity - 1)等价于取模运算而且运算速度更快。负载因子默认0.75当元素数量超过容量乘以负载因子时触发扩容扩容成原来的两倍。在Java 8之后链表长度超过8时会转成红黑树来降低查询复杂度。能把这些讲清楚说明你有阅读源码的习惯这在开发岗是非常加分的。5.2 手写代码题最容易翻车的几个点简答题和编程题里经常让人手写“单例模式”“生产者消费者”“反转字符串”“数组去重”这类代码。看起来简单翻车点却非常多。单例模式要写线程安全版本双重检查锁里volatile那个坑很多人背了但没真正理解——这里的volatile是为了防止指令重排序导致其他线程拿到未完全初始化的对象。生产者消费者要用wait和notify或者用BlockingQueue关键是把线程协作逻辑写清楚并且要用while循环去判断条件而不是if否则会出现虚假唤醒问题。反转字符串要注意传入Null时怎么办以及反转后是否要求保持原字符串不变。数组去重如果是有序数组可以用双指针原地去重空间复杂度O(1)如果是无序数组要么排序再去重要么借助HashSet。这些思路不难难的是写代码时的手感和边界控制。我建议考前把几个经典手写题练到“闭眼能写”的程度并且故意在代码里加空判断、长度判断哪怕多写两行也会让阅卷人觉得这个人工程意识很好。毕竟笔试不只是看对错还看你写出来的代码像不像一个合格开发者的日常产出。6. 一套可落地的笔试备考方案6.1 考前一个月的节奏建议如果你想认真准备这种综合性笔试一个月左右的周期比较合理。前两周用来打基础把数据结构、数据库、操作系统、网络、Java五门课的核心知识点过一遍重点是概念和常见考点框架不需要深抠偏题怪题。中间一周用来刷题按题型分类刷算法题每天保持两到三道SQL题每天两题其他科目以看题背点为主。最后一周做模拟找一套往年的笔试题或模拟题给自己限定时间完整做一遍然后复盘每道题为什么错。这里有一个很朴素的道理笔试是限时应试不是学术研究。你光“会”不行还得“快”。平时不模拟考场上一旦遇到不熟的题很容易把时间耗光后面会做的题也没时间写。我当时准备时踩过的坑就是太迷信刷难题结果选择题里的基础概念反而丢分后来调整策略把80%的时间花在基础知识和经典题型上效果立刻好了很多。参考资料方面数据结构可以看经典教材数据库可以看MySQL技术相关内容并发方面推荐《Java并发编程实战》网络和操作系统的图解题效率也很高。6.2 考场上时间分配与做题顺序拿到卷子后先花三到五分钟把整张卷子扫一遍看一眼题量、题型和分值分布心里有个数。我通常建议按“先易后难、先高分后低分”的顺序做选择题快速解决卡住超两分钟的先标记跳过简答题挑自己有把握的先写编程题留足四十分钟以上因为代码题的分值占比通常最高。一个参考时间分配如下表试卷部分建议时间做题策略选择题/判断题20-30分钟快速过2分钟内做不出先跳过简答题30-40分钟先说逻辑再写结论分点作答编程题40-60分钟先写算法步骤再写代码最后检查边界全文检查10分钟补空题、查选择题答案还有一个小技巧简答题和编程题如果时间不够哪怕写两三行要点也要写。阅卷是按点给分的多写一个要点就可能多拿一分。但要注意不要瞎编写上去的东西一定要有把握。比如问你TCP和UDP区别你不确定UDP有没有拥塞控制那就不要乱写只写确定的点反而更稳妥。6.3 代码题书写规范直接影响阅卷好感度手写代码时字迹和格式很重要。如果你在线上答题注意代码缩进如果是纸笔答题写好变量名、函数名、括号匹配。我见过很多候选人代码逻辑是对的但因为写得乱阅卷人看不清楚最后分数很不理想。这不是玄学而是真实的阅卷痛点阅卷人一天看几十份卷子不可能逐行辨认潦草的代码。代码里最好加上注释特别是关键步骤比如“这一步是为了处理空链表”或者“这里用快慢指针找中点”。注释不会加分太多但能让阅卷人一眼看出你的思路降低误判概率。另外函数命名要见名知意变量不要用a、b、c这种没有含义的命名。比如写一个去重方法叫removeDuplicates就比func1好得多局部变量pre、cur、next也比p、q、r清晰。这些细节都体现一个工程师的代码素养而代码素养恰恰是笔试中除了“对不对”之外最容易被评估的软指标。7. 常见失误与避坑经验速查7.1 我见过的高频翻车现场根据我自己的经验和身边同事的反馈整理了一些最常见的扣分点用表格列出来可以直接对照自查。考点典型失误正确姿势算法二分查找循环条件写错导致死循环或漏查推演left和right的更新用具体例子验证算法链表题忘记处理空链表和单节点开头先判空画图再写代码算法快排的partition函数边界写错记住最后要交换基准元素到正确位置数据库GROUP BY和HAVING使用错误记住WHERE过滤行、HAVING过滤组数据库多表连接漏条件产生笛卡尔积每个JOIN都写出关联键数据库COUNT(列名)与COUNT(*)混淆记住列名忽略NULL星号统计行数操作系统死锁条件只背名字不会举例准备一个两个线程互相等锁的小例子网络TCP四次挥手状态顺序记混用“客户端主动关闭”这个视角记忆JavaHashMap的扩容机制说不清记住负载因子0.75扩容翻倍Java匿名内部类使用外部位变量没加final理解变量捕获机制Java 8后等价final7.2 刷题之外的三个隐藏加分项第一关注公司的产品和业务。恒生做的是金融IT你在笔试简答题里如果能体现出对证券交易、清算、风险控制这些业务的基本认知哪怕只是一句话都会让面试官觉得你是做过功课的。比如在回答事务问题时顺带提一句“证券交易中的资金冻结和解冻必须保证原子性”这句话不一定加分但能体现你的业务敏感度。第二答题时多写“为什么”。选择题只能死选但简答题完全有机会展示你的思考过程。多写一句“选择这个方案是因为它保证了数据一致性”比你罗列一堆名词有价值得多。因为阅卷人想看的不只是你知道这个知识点而是你在真实场景里会不会正确应用。第三别忽略软素质的体现。比如编程题里如果输入参数不合法你写了校验逻辑SQL题里你说明这条语句会走哪个索引网络题里你提到实际环境下会考虑拥塞控制。这些细节都在传递一个信号你是一个会思考工程落地的人而不是只会背书的应试者。金融IT行业尤其看重这一点毕竟系统上线之后出问题靠的就是这种风险意识去提前规避。最后说点实在的。我自己当年准备这类笔试时最大的教训就是太迷信“刷难题”结果选择题里的很多基础概念反而丢分比如一处SQL里COUNT的NULL陷阱、一处TCP状态顺序都是背过的但又没真正记牢。后来我调整策略把大部分时间花在基础和经典题型上难题只求见过、不求死磕效果反而好了很多。所以如果你正在准备这类笔试我的建议很简单把数据结构、数据库、网络、操作系统这些“基本功”当成主菜把算法难题当成甜点先保证主菜吃得扎实再考虑额外加分。这套思路不管题目年份是2016还是2026都不会过时。