最近 JPMorgan Chase OA 已经开始批量发放,平台依旧是熟悉的 HackerRank。整体难度不高,但节奏要求很紧,属于那种“会就是送分,不会就卡住”的典型筛选题。这次分享一套非常高频的组合:滑动窗口 + 贪心(堆),基本很多人都会遇到类似版本。
题目 1:Highly Profitable Months
题目解析
题意:给定一个股票价格数组 stockPrices 和参数 k,找出所有长度为 k 的连续子区间,满足区间内股票价格严格递增,统计这样的区间数量。
- 特殊情况:当
k=1时,所有单个元素都满足条件,直接返回数组长度n。 - 核心判断:对于每个长度为
k的窗口,检查是否满足stockPrices[i] < stockPrices[i+1] < ... < stockPrices[i+k-1]。
解题思路:
- 先预处理数组,生成一个 “递增标记数组”:
inc[i] = 1当且仅当stockPrices[i] < stockPrices[i+1],否则为0。 - 长度为
k的严格递增区间,等价于在标记数组中存在长度为k-1的连续1。 - 统计标记数组中连续
k-1个1的窗口数量,即为答案。
示例:
stockPrices = [5, 3, 5, 7, 8],k=3
- 标记数组:
[0, 1, 1, 1](因为5>3、3<5、5<7、7<8) - 寻找连续
2个1的窗口:[1,1](位置 1-2)、[1,1](位置 2-3),共 2 个,与示例结果一致。
题目 2:Array Reduction 1
题目解析
题意:给定整数数组 num,每次操作选择两个不同元素,删除它们并将和加入数组末尾,操作代价为两数之和。求将数组缩减到只剩 1 个元素时的最小总代价。
解题思路:
这是经典的 哈夫曼编码(Huffman Coding) 问题,等价于合并果子问题:
- 每次合并两个最小的元素,总代价最小。
- 原理:较小的数会被多次计入总和,优先合并小数可以让它们的和被更少次累加,从而总代价最小。
- 实现:使用最小堆(小根堆),每次弹出两个最小元素求和,将和重新入堆,并累加代价,直到堆中只剩一个元素。
示例:
num = [4,6,8]
- 堆初始化:
[4,6,8] - 第一次合并:
4+6=10,代价10,堆变为[8,10] - 第二次合并:
8+10=18,代价18,总代价10+18=28,与示例最小结果一致。
关于 JPMorgan Chase OA 的小分享
这次 JPMorgan Chase OA 能比较顺利地快速通过,说实话很大一部分原因是提前找了 ProgramHelp 帮忙做针对性准备。他们团队配置确实挺硬核的:核心一共 7 个人,背景都很顶,有名校背景,另外还有在 Amazon、Google 和阿里这种一线大厂在职的工程师。
形式上是远程协助,不会影响你正常操作,整体比较低调、安全。如果你最近也在准备类似:JPMorgan Chase,Goldman Sachs,或者 Amazon 这种 OA / 笔试,有人帮你把关,确实会稳很多。