Oracle Coding 面試 怎麼過?真實高頻題 + 解題思路全整理

最近剛完成了一次 Oracle 的 Coding 面試,整體體驗還不錯。讓我比較滿意的是,每一輪的發揮都比較穩定,沒有出現明顯失誤。這次能順利透過,也確實離不開 Programhelp 的幫助。所以也想把這次的面試經歷,以及我整理到的一些真實題目分享出來,給後面準備 Oracle Coding 面試 的同學做個參考。

Oracle Coding 面試 怎麼過?真實高頻題 + 解題思路全整理

Oracle Coding 面試 流程概述

環節 內容 建議
面試官 & 團隊介紹 面試官自我介紹,並介紹團隊及其工作內容 認真聆聽關鍵資訊,後續可以複用;如有機會可問 1–2 個有深度的問題
專案 & 挑戰討論 討論過往專案,以及解決過的一個具有挑戰性的問題 按「問題 → 行動 → 結果」展開;突出影響力和決策中的權衡
處理未知問題 詢問如何應對不熟悉且資訊不足的問題 展示結構化思維:拆解問題、查資料、迭代方案,必要時主動求助
編碼(Coding) 使用雙指標解決 “Container With Most Water”(盛最多水的容器) 清晰講思路;解釋指標移動邏輯;注意邊界情況;目標時間複雜度 O(n)

Oracle 真實Coding面試題目

問題 1:Ratan 的股票利潤

問題描述:

Ratan 是一個超級有錢的富豪,而且他運氣極好,總能以最優的方式買賣股票來獲得最大利潤。他總是以最低價買入股票,然後以最高價賣出,從而最大化利潤。

現在你是稅務官員,需要根據每天的股票價格計算 Ratan 所獲得的最大利潤。你只需要計算他單次交易(一次買入 + 一次賣出)能獲得的最大利潤。

注意:

  • Ratan 從不虧本(即如果無法獲利,則利潤為 0,不進行交易)。

示例 1: 價格 = [1, 6, 2] Ratan 在第一天以 1 元買入,第二天以 6 元賣出,最大利潤為 5。

示例 2: 價格 = [9, 8, 6] 股價一直下跌,Ratan 沒有買入,最大利潤為 0。

輸入格式: 第一行是一個整數 n,表示總天數(股票價格的天數)。 接下來 n 行,每行一個整數,表示當天股票的價格。

輸出格式: 單行輸出一個整數,表示 Ratan 獲得的最大利潤。

約束條件:

  • 1 ≤ n ≤ 10⁸(天數最多 1 億,需要注意時間和空間複雜度)

樣例輸入(自定義測試):

text

7
1
9
2
11
1
9
2

樣例輸出:

text

10

解釋: 最大利潤是在價格為 1 時買入(第 1 天或第 5 天),在價格為 11 時賣出(第 4 天),利潤 = 11 – 1 = 10。

程式碼參考

def func(diff):
    n=len(diff)
    if n==0:
        return 0
    mx=max(diff)
    if mx <= 0:
        return 0
    mxS=0
    cS=0
    for i in diff:
        cS+=i
        if cS <= 0:
            cS=0
        mxS=max(cS,mxS)
    return mxS

n=int(input())
arr=[]
diff=[]
ans=[0]
for i in range(n):
    arr.append(int(input()))c++
for i in range(n-1):
    diff.append(arr[i+1]-arr[i])
ans=func(diff)
if ans < 0:
    print("0")
else:
    print(ans)

問題 2:銀行貸款比較

問題描述:

有兩家銀行——Bank A 和 Bank B,它們的利率各不相同。你收到了兩家銀行的貸款報價,包括年利率、貸款期限(年)以及在整個期限內利率的變化情況。

你必須選擇總利息成本最低的貸款方案,並拒絕另一個。請進行計算並做出明智的選擇。

貸款以每月頻率償還,等額月供(EMI)使用以下公式計算:

EMI = loanAmount × monthlyInterestRate / (1 – 1 / (1 + monthlyInterestRate)^(numberOfYears × 12))

其中:

  • monthlyInterestRate = 年利率 / 12 / 100
  • numberOfYears 為當前利率分段(slab)對應的年數

約束條件:

  • 1 ≤ P(本金) ≤ 1,000,000
  • 1 ≤ T(總年限) ≤ 50
  • 1 ≤ N1(Bank A 分段數) ≤ 30
  • 1 ≤ N2(Bank B 分段數) ≤ 30

輸入格式:

  • 第一行:P(本金 Loan Amount)
  • 第二行:T(總期限,總年數)
  • 第三行:N1(Bank A 的利率分段數量)
  • 接下來 N1 行:每行兩個數 —— 年數 年利率(例如:5 9.5 表示此分段持續 5 年,年利率 9.5%)
  • 接下來一行:N2(Bank B 的利率分段數量)
  • 接下來 N2 行:每行兩個數 —— 年數 年利率

注意: 分段從第 1 年開始,依次累加,後一個分段從前一個分段結束後的下一年開始。

輸出格式:

輸出一行,表示你選擇的銀行:Bank ABank B(選擇總支付金額更低的銀行)。

示例 1

輸入:

text

10000
20
3
5 9.5
10 9.6
5 8.5
3
10 6.9
5 8.5
5 7.9

輸出:

text

Bank B

示例 2

輸入:

text

500000
26
3
13 9.5
3 6.9
10 5.6
3
14 8.5
6 7.4
6 9.6

輸出:

text

Bank A

程式碼參考

bank = []
principal = int(input())
year = int(input()
for i in range(0, 2): # 2 Banks
    installments = int(input())
    sum = 0
    for i in range(0, installments):
        time, roi = [float(i) for i in input().split()]
        square = pow((1+roi), time*12)
        emi = (principal*(roi)/(1-1/square))
        sum = sum + emi
    bank.append(sum)
if bank[0] < bank[1]:
    print("Bank A")
else:
    print("Bank B")
Output:
10000
20
3
5 9.5
10 9.6
5 8.5
3
10 6.9
5 8.5
5 7.9
Bank B

問題 3:網路流

問題描述:

有一個包含 n 個資料包的流到達伺服器。該伺服器只能處理大小恰好為 2ⁿ 個單位(units)的資料包,其中 n 是非負整數(0 ≤ n)。

所有資料包會按順序被重新打包成當前最大的可能 2ⁿ 大小。打包後剩餘的部分會累加到下一個到達的資料包中,然後再進行重新打包。

請找出在給定資料包流中,重新打包後的最大資料包大小。

示例: 到達的資料包 = [12, 25, 10, 7, 8]

  • 第一個資料包有 12 個單位。能打包的最大 2ⁿ 是 2³ = 8(因為下一個 2⁴ = 16 大於 12)。 剩餘 12 – 8 = 4 個單位,累加到下一個資料包。
  • 下一個資料包變為 4 + 25 = 29 個單位,能打包的最大 2ⁿ 是 2⁴ = 16,剩餘 29 – 16 = 9 個單位。
  • 下一個變為 9 + 10 = 19 個單位,能打包的最大 2ⁿ 是 16,剩餘 19 – 16 = 3 個單位。
  • 下一個變為 3 + 7 = 10 個單位,能打包的最大 2ⁿ 是 8,剩餘 10 – 8 = 2 個單位。
  • 最後一個變為 2 + 8 = 10 個單位,能打包的最大 2ⁿ 是 8。

重新打包後的最大大小為 16 個單位。

返回: long 型別 —— 流中重新打包後的最大資料包大小。

約束條件:

  • 1 ≤ n ≤ 10⁵
  • 1 ≤ arrivingPackets[i] ≤ 10⁹

樣例輸入 0:

text

5
13
25
12
2
8

樣例輸出 0:

text

16

參考程式碼

def largeRepackagedPacket(arr):
    twoP = [int(2**i) for i in range(31)]
    x = 0
    ans = 0
    for i in arr:
        i = i + x
        for j in range(31):
            if i < twoP[j]:
                break
        x = i - twoP[j - 1]
        if ans <= twoP[j - 1]:
            ans = twoP[j - 1]
    return ans


Packets = []
for i in range(int(input())):
    Packets.append(int(input()))
print(largeRepackagedPacket(Packets))

怎樣有效準備Oracle Coding 面試?

HackerRank 官方資源:
強烈建議作為首選練習平臺。Oracle 很多 OA 和部分面試 Coding 環節本身就是在這個平臺上進行的,因此提前熟悉介面和提交流程非常關鍵。

面經與經驗總結:
刷題之外,提前瞭解真實面試流程和高頻考點也非常重要。Programhelp根據以往輔助案例整理了大量面經,可以更清楚 Oracle 常考哪些題型、面試官關注哪些點。

比如:

LeetCode 補充練習:
適合作為日常刷題平臺來提升手感。題庫覆蓋非常全面,而且有公司標籤,可以針對性刷 Oracle / 大廠相關題目。

建議重點關注:

  • 雙指標(如 Container With Most Water)
  • 連結串列(LRU Cache)
  • 堆 / 優先佇列(Merge K Lists)
  • 樹的遞迴(刪除葉子節點類問題)

VO 面試輔助
如果已經進入 VO 階段,其實很多同學會發現:
卡的不是“不會寫”,而是時間壓力 + 表達 + 臨場思路斷層。ProgramHelp VO面試輔助透過北美CS專家實時提示與思路引導,幫助你清晰表達、應對 follow-up,大幅提升透過率,尤其適合刷題穩但實戰不穩的同學。

author avatar
Jory Wang Amazon資深軟體開發工程師
Amazon 資深工程師,專注 基礎設施核心系統研發,在系統可擴充套件性、可靠性及成本最佳化方面具備豐富實戰經驗。 目前聚焦 FAANG SDE 面試輔導,一年內助力 30+ 位候選人成功斬獲 L5 / L6 Offer。
END
 0