上海银行笔试真题:全考计算机知识,两道编程都栽在边界情况
- 轮次
- 笔试
- 时间
- 2026-11
- 来源
- 牛客网
《面试题目》
- 上海银行笔试考什么?有没有行测(言语理解、图形推理)和英语?
- 试卷结构是怎样的,单选、多选、编程各多少题?
- 单选和多选主要考哪些内容,会不会考金融和时政?
- 编程题难度如何?
- 编程题一:在自然数列里找出一组数,使它们的和为 k,怎么求?有哪些容易漏的边界?
- 编程题二:给定矩形的长宽 n、m,可以在这两个数之间分离因子 2(把一方的因子 2 移到另一方),求能得到的最大的周长,怎么做?
《参考解析》
笔试结构与准备方向。 这场笔试是纯计算机卷:单选 15、多选 15、编程 2,没有言语理解、图形推理和英语,也不涉及金融常识与时政。多选题是拉分点——银行笔试的多选通常「少选得分、错选不得分」,比单选更能筛人。准备时按计算机基础课的目录过一遍就够:操作系统(进程线程、内存管理、死锁)、计算机网络(分层、TCP、HTTP)、数据库(SQL、索引、事务隔离级别)、数据结构与算法、编程语言基础(Java/C++ 的语法细节与集合类)。想练手可以直接拿计算机二级、软考初级的选择题刷,题型高度重合。
编程题一:找一组自然数使和为 k。 这题的关键是先问清「是不是必须连续」「能不能重复使用」「要不要求组数最少」,条件不同解法完全不同。若允许任选不重复的自然数,本质是子集和(0/1 背包):dp[s] 表示能否凑出 s,转移 dp[s] |= dp[s - x],再用一个 pre 数组回溯出具体选了哪些数,复杂度 O(nk)。若要求连续区间,用前缀和加哈希表:遍历时把 前缀和 - k 放进哈希表查,一遍 O(n) 就能拿到所有区间。
漏用例的典型来源有三个。其一是对称解:当 k 为偶数时,「两个数各取 k/2」是一种合法分法,如果只按「从大到小贪心取」遍历,很可能第一步取了 k/2 之后就跳过了第二个 k/2,或者只允许严格递增而把这个解排掉。其二是空集与单元素:k = 0 时答案可以是空集,k 很小时可能只有一个数就够,这两类要在循环边界外单独判。其三是数值范围:k 很大时 O(nk) 的背包会超时超内存,得换数学构造或 meet-in-the-middle。写完先自己在纸上把 k = 1、2、3、4、偶数、奇数各跑一遍,再交。
编程题二:用因子 2 换最大周长。 这题有一步很关键的观察:无论怎么在两个数之间搬因子 2,两边乘积(面积)都不变,因为搬走一个 2 相当于一边除以 2、另一边乘以 2。面积固定时,周长 2(a + b) 要最大,就是要让 |a - b| 最大——把两边拉得越开越好。
所以正确做法是:先把 n 和 m 里所有的因子 2 都分离出来,写成 n = a · 2^i、m = b · 2^j,其中 a、b 都是奇数;然后把全部 i + j 个 2 都堆到较大的那个奇数上,得到 (max(a,b) · 2^(i+j), min(a,b)),周长即为 2 · (max(a,b) · 2^(i+j) + min(a,b))。也可以反向理解:把因子 2 从小的那边全部挪到大的那边,差距最大。
原作者第一次的做法是「先交换令 n ≤ m,再从 n 里分离因子 2」,方向搞反了——先排序会把「原本哪个数更大」这个信息用错,而且只从一边分离就丢掉了另一边本来就有的因子 2。反过来也说明这题的检查方法:拿几组小数据暴力枚举所有搬法,和贪心结果对拍,91.67% 这种「差一个用例」的通过率通常就是某类对称或相等的情况没覆盖。
两道题共同的教训。 银行笔试的编程题几乎不会考复杂算法,考的是边界是否想全。可行的复盘习惯是:写完先列出「最小值、最大值、相等、全奇数、全偶数、结果为 0」这几类输入,逐个手算期望输出,再提交。第一次提交只过部分用例时,优先怀疑边界而不是怀疑算法,因为这类题的算法本身通常一眼可见。