华为OD机试真题——阿里巴巴找黄金宝箱Ⅰ(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《阿里巴巴找黄金宝箱Ⅰ》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C
GO
题目名称:阿里巴巴找黄金宝箱Ⅰ
- 知识点:前缀和、双指针(或逻辑模拟)
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。
黄金宝箱满足:排在它之前的所有箱子数字和等于排在它之后的所有箱子数字和;
- 第一个箱子左边部分的数字和定义为0;
- 最后一个宝箱右边部分的数字和定义为0。
请帮阿里巴巴找到黄金宝箱,输出第一个满足条件的黄金宝箱编号,如果不存在黄金宝箱,请返回-1。
输入描述:
箱子上贴的数字列表,使用逗号分隔,例如:1,-1,0
。
- 宝箱的数量不小于1个,不超过10000;
- 宝箱上贴的数值范围不低于-1000,不超过1000。
输出描述:
第一个黄金宝箱的编号(从0开始计数)。
示例:
- 输入:
2,5,-1,8,6
,输出:3
- 下标3之前的数字和为:
2 + 5 + -1 = 6
,之后的数字和为:6 = 6
。
- 下标3之前的数字和为:
- 输入:
8,9
,输出:-1
(无满足条件的位置)。 - 输入:
11
,输出:0
(下标0左右和均为0)。
Java
问题分析
我们需要找到数组中第一个满足左边元素和等于右边元素和的索引位置。左边和右边的定义分别为该位置前所有元素的和及该位置后所有元素的和。若不存在这样的位置,返回-1。
解题思路
- 总和计算:首先计算数组所有元素的总和。
- 遍历检查:遍历数组,维护一个累积的左边和
leftSum
。对于每个位置i
,右边的和为totalSum - leftSum - nums[i]
。如果左边和等于右边的和,则返回当前索引。 - 线性时间复杂度:该方法只需两次遍历数组(一次计算总和,一次查找位置),时间复杂度为 O(n),空间复杂度为 O(1)(不考虑输入存储空间)。
代码实现
public class Main {public static void main(String[] args) {// 读取输入并转换为整数数组java.util.Scanner scanner = new java.util.Scanner(System.in);String input = scanner.nextLine();String[] parts = input.split(",");int[] nums = new int[parts.length];for (int i = 0; i < parts.length; i++) {nums[i] = Integer.parseInt(parts[i]);}// 计算总和int totalSum = 0;for (int num : nums) {totalSum += num;}// 遍历数组查找黄金宝箱位置int leftSum = 0;for (int i = 0; i < nums.length; i++) {int current = nums[i];// 右边的和 = 总和 - 左边和 - 当前元素值int rightSum = totalSum - leftSum - current;if (leftSum == rightSum) {System.out.println(i);return;}leftSum += current;}// 未找到符合条件的宝箱System.out.println(-1);}
}
代码详解
-
输入处理:
scanner.nextLine()
读取输入字符串。split(",")
将字符串按逗号分割成字符串数组。- 转换为
int[]
数组nums
。
-
总和计算:
- 遍历数组累加所有元素的值得到
totalSum
。
- 遍历数组累加所有元素的值得到
-
遍历检查:
- 初始化
leftSum
为0,表示当前位置左边的累积和。 - 遍历每个元素
nums[i]
,计算右边的和rightSum
。 - 如果
leftSum
等于rightSum
,输出当前索引并结束程序。 - 否则,将当前元素值加到
leftSum
中,继续下一个元素。
- 初始化
-
结果输出:
- 若遍历结束未找到符合条件的索引,输出-1。
示例测试
示例1:
输入:2,5,-1,8,6
输出:3
解析:索引3左边和为2+5+(-1)=6,右边和为6,相等。
示例2:
输入:8,9
输出:-1
解析:两个位置均不满足左边和等于右边和。
示例3:
输入:11
输出:0
解析:左边和与右边和均为0。
综合分析
- 时间复杂度:两次遍历数组,时间复杂度为 O(n),n为数组长度。对于最大输入规模1e4,完全可行。