招银网络科技线下面:类设计、千万级余额查询与合并有序链表
- 轮次
- 线下面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 有实习吗?
- 挑一个你最熟悉的项目讲一下。
- 合并两个有序链表,不允许开数组,说下思路。
- 银行账户银行卡余额查询业务,设计一下类。
- 你设计的这些有哪些问题?
- 千万级余额查询,如何优化?
- 还学过其他技术吗?
《参考解析》
这类线下面的判分逻辑:20 分钟、7 个问题、面完直接让回学校——这种节奏说明面试官在很短的时间里做的是定性判断,而不是逐项打分。银行系(招银网络科技是招商银行的科技子公司)的线下批量面通常按四件事快速筛人:表达是否清楚、基础是否扎实、项目是不是真做过、稳定性够不够。答得慢、答得空,或者项目讲不出细节,很快就会被跳过。原帖标题自嘲「凉透经」,从时长和结尾看,大概率是在项目或设计题上没接住追问——这类短面试里,能被追问三层的人才留得下来。
「挑一个你最熟悉的项目讲一下」:这是全场最值钱的两分钟,建议的框架是「一句话说清这个系统做什么、给谁用 → 你负责哪部分 → 技术选型与理由 → 最难的一个点怎么解决的 → 有没有量化结果」。20 分钟最多讲一个项目,讲深比讲多有用;最常见的失分是流水账式报技术栈,面试官听不出你做过什么决策。没有实习的话,用课程设计、竞赛或自学的完整项目顶上,重点同样放在「你遇到的问题和你的选择」上,而不是功能列表。
合并两个有序链表且不允许开数组:这里的限制实际是「不要借助额外容器」,也就是要 O(1) 的辅助空间。标准做法是双指针 + 哑结点迭代归并:dummy 指向结果头,cur 指向已接好的尾节点,比较 l1、l2 当前节点的值,把小的那个接到 cur 后面并推进该链表;任一条走完后,把另一条剩下的整段接上即可。要主动交代边界:某条链表为空时直接返回另一条、值相等时取哪条都行但要一致、返回的是 dummy.next 而不是 dummy。递归写法代码更短,但递归深度是 O(n) 的调用栈,本质上不符合「不开额外空间」的意图,所以先给迭代、再提递归并说明代价,比直接写递归更稳。面试官只说「说下思路」,说明他在看你能否讲清指针操作,而不是能否背出代码。
类设计题(银行账户与银行卡余额查询)怎么答:设计题不要一上来就画类,先反问边界:查谁(本人查询,还是柜面、客服代查)、按卡号还是账号、是否要求强一致、账户规模与 QPS 量级、要不要支持多币种与冻结金额。然后给分层:Card(卡,与账户是一对多)、Account(账户,持有余额与状态)、BalanceService(查询逻辑)、BalanceRepository(持久化);查询结果用 BalanceView 这类 DTO 返回,不要让持久化对象直接出到接口层。关键设计点是读写分离与职责单一:余额查询读多写少,查询走缓存或从库、扣款走事务;Account 只维护不变量(比如余额不能为负),业务编排放在 service 层。面试官紧接着问「你设计的有哪些问题」,这是让你自评——最好的应对是主动认领两三个真实缺陷并给出改法,而不是辩解:贫血模型导致不变量散落在 service;用 double 存金额(必须用 BigDecimal 或以分为单位的整数);没有区分「账面余额 / 可用余额 / 冻结金额」,也没考虑多币种;并发扣款缺锁或乐观锁版本号;查询接口缺幂等与审计。当场说出这些,比被一条条问出来强得多。
千万级余额查询怎么优化:先分清瓶颈再谈手段。数据量的直觉是:千万行在 B+ 树上只有三层,主键或唯一索引点查也就一两次页读取——所以「千万级」本身不可怕,慢通常来自没走索引、跨分片聚合、锁等待或连接池排队。按层给方案:① 存储层——按 account_id 或 user_id 哈希分库分表,保证一次查询能路由到单表;把余额从流水里拆出来单独成表(余额表只存当前值,流水另存),避免每次 SUM 扫历史;索引按真实查询条件建唯一索引,杜绝无索引的模糊查询。② 缓存层——Redis 缓存「账号 → 余额 + 版本号」,命中率高、数据库压力骤降;一致性用「先更新 DB 再删除缓存」或订阅 binlog 刷新,别用「先删缓存再写库」;热点账户(比如平台大商户)会把单 key 打满一个分片,要拆成多个分片键再聚合,或加本地缓存。③ 读写分离——查询走从库,但要如实说明主从延迟对余额的影响:银行业务对余额实时性要求高,通常读主或读「主库 + 短时缓存」,而不是直接读从库。④ 接口与工程侧——限制查询维度、游标分页、结果缓存、限流降级、慢查询治理;余额这类字段还可以做对账与 T+0 校验兜底。最后主动把「性能与一致性」的取舍摆出来,设计题才算答完整。
「还学过其他技术吗」别浪费:这题看着像闲聊,其实是给你补分甚至翻盘的机会。答「什么都会一点」等于放弃;正确的答法是给一个具体的技术 + 你拿它做过什么 + 现在理解到哪一层,例如最近在学某个消息中间件并写了小 demo,或者读过某个开源项目的某段源码。关键是别答得比前面的题还虚——面试官问这句,往往是因为前面还没问出你的深度,想再给一次机会。