最近剛完成了一次 Oracle 的 Coding 面試,整體體驗還不錯。讓我比較滿意的是,每一輪的發揮都比較穩定,沒有出現明顯失誤。這次能順利透過,也確實離不開 Programhelp 的幫助。所以也想把這次的面試經歷,以及我整理到的一些真實題目分享出來,給後面準備 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 A 或 Bank 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,大幅提升透過率,尤其適合刷題穩但實戰不穩的同學。