← 返回博客列表
JPMorgan

JP Morgan Chase NAMR SWE Campus 2026 OA 真题解析:会议调度 + 数组缩减

2026-03-27

JP Morgan Chase OA

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)。

关键点


题目二: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

分配方案:

解题思路

经典贪心 + 最小堆(扫描线):

  1. 按会议开始时间排序。
  2. 用最小堆维护已分配会议室的最早结束时间
  3. 遍历每场会议:
    • 若堆顶结束时间 当前会议开始时间(允许共用),弹出堆顶(复用会议室),压入当前结束时间。
    • 否则直接压入当前结束时间(新开一间)。
  4. 堆的大小即为所需会议室数。
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),排序主导。

关键点


总结

题目 核心思路 复杂度
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