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,大幅提升通过率,尤其适合刷题稳但实战不稳的同学。

END
 0