最近刚完成了一次 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,大幅提升通过率,尤其适合刷题稳但实战不稳的同学。