最近 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 / 筆試,有人幫你把關,確實會穩很多。