
JP Morgan Chase & Co. NAMR Software Engineer Program 2026 校招 OA 限时 60 分钟,共两道算法题。以下为完整题意与解题思路。
题目一:Reduction 3 — 数组缩减总代价
题意
给定 n 个整数的数组 arr,每次操作从当前数组中取出最小值 min 和最大值 max,将它们的和放回数组。操作代价为:
cost = ceil((min + max) / (max - min + 1))
共执行 n−1 次操作,最终数组只剩一个元素,求总代价。
示例
arr = [2, 3, 4, 5, 7],操作过程:
| 步骤 | 选取 min/max | 代价计算 | 当前数组 | 累计代价 |
|---|---|---|---|---|
| 1 | 2, 7 | ceil(9/6) = 2 | [3,4,5,9] | 2 |
| 2 | 3, 9 | ceil(12/7) = 2 | [4,5,12] | 4 |
| 3 | 4, 12 | ceil(16/9) = 2 | [5,16] | 6 |
| 4 | 5, 16 | ceil(21/12) = 2 | [21] | 8 |
输出:8
Sample Case 0
输入:arr = [3, 5, 2, 1, 9, 6],输出:10
解题思路
每次都需要取当前数组的最小值和最大值,天然适合用最小堆 + 最大堆(或排序后双指针)维护。
用双堆实现:
import heapq
from math import ceil
def findTotalCost(arr):
min_heap = arr[:]
heapq.heapify(min_heap)
max_heap = [-x for x in arr]
heapq.heapify(max_heap)
# 由于每次操作后要同步更新两个堆,更简单的方式是用排序数组模拟
arr.sort()
total = 0
while len(arr) > 1:
mn, mx = arr[0], arr[-1]
cost = ceil((mn + mx) / (mx - mn + 1))
total += cost
arr = arr[1:-1]
# 将 mn+mx 插入有序数组
s = mn + mx
lo, hi = 0, len(arr)
while lo < hi:
mid = (lo + hi) // 2
if arr[mid] < s:
lo = mid + 1
else:
hi = mid
arr.insert(lo, s)
return total
复杂度:O(n² ) 在 n 较小时完全可接受;若 n 很大可用 SortedList(Python sortedcontainers)做到 O(n log n)。
关键点
ceil(a/b)在整数运算中等价于(a + b - 1) // b,避免浮点误差。- 每次取全局最小和最大,不是局部的,因此必须动态维护有序结构。
题目二:Meeting Scheduler — 最少会议室数
题意
给定 n 场会议的起止时间 meetingTimings[i] = [start, end],同一会议室内会议不得重叠(但允许 end == start 时连续使用同一间)。求最少需要几间会议室。
示例
meetingTimings = [[1,4],[1,5],[5,6],[6,10],[7,9]]
按时间轴模拟,最多同时进行 2 场会议,需要 2 间会议室。
Sample Case 0
输入:[[2,8],[3,9],[5,11],[3,4],[11,15],[8,20]],输出:3
分配方案:
- Room 1: [2,8] → [8,20]
- Room 2: [3,4] → [5,11] → [11,15]
- Room 3: [3,9]
解题思路
经典贪心 + 最小堆(扫描线):
- 按会议开始时间排序。
- 用最小堆维护已分配会议室的最早结束时间。
- 遍历每场会议:
- 若堆顶结束时间 ≤ 当前会议开始时间(允许共用),弹出堆顶(复用会议室),压入当前结束时间。
- 否则直接压入当前结束时间(新开一间)。
- 堆的大小即为所需会议室数。
import heapq
def getMinRooms(meetingTimings):
meetings = sorted(meetingTimings, key=lambda x: x[0])
heap = [] # 存各会议室的最早结束时间
for start, end in meetings:
if heap and heap[0] <= start:
heapq.heapreplace(heap, end)
else:
heapq.heappush(heap, end)
return len(heap)
复杂度:O(n log n),排序主导。
关键点
- 注意题目明确:
end == start可以共用同一间(用<=而非<)。 - 堆只存结束时间,大小天然等于当前使用的房间数。
总结
| 题目 | 核心思路 | 复杂度 |
|---|---|---|
| Reduction 3 | 有序结构动态维护 min/max,逐步合并 | O(n²) 或 O(n log n) |
| Meeting Scheduler | 排序 + 最小堆扫描线 | O(n log n) |
两题都是经典贪心/堆题,60 分钟内稳定完成没有问题。
💬 需要 OA / VO 辅助?
JP Morgan、Goldman Sachs、Citadel、Two Sigma 等量化与金融科技方向的笔试题型持续整理中。有不确定的题欢迎直接来问。
微信:Coding0201
#留学生找工作 #JPMorgan校招 #北美求职 #OA代做 #算法面试 #面经
📬 联系方式
Email: [email protected]
Telegram: @OAVOProxy