题目描述
一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。
黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字和;第一个箱子左边部分的数字和定义为0;最后一个宝箱右边部分的数字和定义为0。
请帮阿里巴巴找到黄金宝箱,输出第一个满足条件的黄金宝箱编号,如果不存在黄金宝箱,请返回-1。
输入描述:
箱子上贴的数字列表,使用逗号分隔,例如1,-1,0。
宝箱的数量不小于1个,不超过10000
宝箱上贴的数值范围不低于-1000,不超过1000
输出描述:
第一个黄金宝箱的编号
用例1
输入
2,5,-1,8,6
1
输出
3
1
说明:
下标3之前的数字和为:2 + 5 + -1 = 6
下标3之后的数字和为:6 = 6
用例2
输入:
8,9
1
输出:
-1
1
说明:
不存在符合要求的位置
用例3
输入:
11
1
输出:
0
1
说明:
下标0之前的数字和为:0
下标0之后的数字和为:0
解题思路
这个问题的解题思路是通过遍历每个箱子,判断当前箱子是否为黄金宝箱。对于每个箱子,需要计算它之前和之后的数字和,然后比较两者是否相等。如果相等,那么当前箱子就是黄金宝箱。
具体步骤如下:
- 初始化左右两部分的和,分别为
left_sum
和right_sum
。 - 遍历每个箱子,对于第i个箱子,计算左部分的和(不包括第一个数字)和右部分的和(不包括当前数字)。
- 判断左部分的和是否等于右部分的和,如果相等,则当前箱子是黄金宝箱,输出它的编号,设置标志为
flag = true
,并且退出循环。 - 如果遍历完所有箱子都没有找到黄金宝箱,输出-1。
这个思路通过遍历一次数组,进行一些累加和减操作,能够有效找到第一个满足条件的黄金宝箱。
题解代码
Python题解代码
import sys
# 输入
input = sys.stdin.readline().strip()
nums = list(map(int, input.split(',')))
n = len(nums)
# 初始化左右两部分的和
left_sum = 0
right_sum = sum(nums)
# 遍历每个箱子,判断是否为黄金宝箱
flag = False # 是否找到黄金宝箱的标志
for i in range(n):
if i != 0: # 左部分的和不包括第一个数字
left_sum += nums[i - 1]
right_sum -= nums[i] # 右部分的和不包括当前数字
if left_sum == right_sum: # 判断是否为黄金宝箱
print(i) # 输出黄金宝箱的编号
flag = True # 找到了黄金宝箱
break # 直接退出循环
# 输出结果
if not flag: # 如果没有找到黄金宝箱
print(-1) # 输出-1
JAVA题解代码
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入
String input = scanner.nextLine();
String[] numsStr = input.split(","); // 以逗号为分隔符,分割数字字符串
ArrayList<Integer> nums = new ArrayList<>(); // 存储输入的数字
for (String numStr : numsStr) {
nums.add(Integer.parseInt(numStr)); // 将字符串转换成整数并存入nums中
}
int n = nums.size(); // 数字个数
// 初始化左右两部分的和
int left_sum = 0, right_sum = 0;
for (int num : nums) { // 计算所有数字的和,作为右部分的和
right_sum += num;
}
// 遍历每个箱子,判断是否为黄金宝箱
boolean flag = false; // 是否找到黄金宝箱的标志
for (int i = 0; i < n; i++) {
if (i != 0) { // 左部分的和不包括第一个数字
left_sum += nums.get(i - 1);
}
right_sum -= nums.get(i); // 右部分的和不包括当前数字
if (left_sum == right_sum) { // 判断是否为黄金宝箱
System.out.println(i); // 输出黄金宝箱的编号
flag = true; // 找到了黄金宝箱
break; // 直接退出循环
}
}
// 输出结果
if (!flag) { // 如果没有找到黄金宝箱
System.out.println(-1); // 输出-1
}
}
}
C/C++题解代码
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int main() {
// 输入
string input;
getline(cin, input); // 获取一行输入
stringstream ss(input); // 将输入转换成stringstream对象,便于逐个获取数字
vector<int> nums; // 存储输入的数字
string temp; // 用于逐个获取数字的临时变量
while (getline(ss, temp, ',')) { // 逐个获取数字,以逗号为分隔符
nums.push_back(stoi(temp)); // 将字符串转换成整数并存入nums中
}
int n = nums.size(); // 数字个数
// 初始化左右两部分的和
int left_sum = 0, right_sum = 0;
for (int num : nums) { // 计算所有数字的和,作为右部分的和
right_sum += num;
}
// 遍历每个箱子,判断是否为黄金宝箱
bool flag = false; // 是否找到黄金宝箱的标志
for (int i = 0; i < n; i++) {
if (i != 0) { // 左部分的和不包括第一个数字
left_sum += nums[i - 1];
}
right_sum -= nums[i]; // 右部分的和不包括当前数字
if (left_sum == right_sum) { // 判断是否为黄金宝箱
cout << i; // 输出黄金宝箱的编号
flag = true; // 找到了黄金宝箱
break; // 直接退出循环
}
}
// 输出结果
if (!flag) { // 如果没有找到黄金宝箱
cout << -1; // 输出-1
}
return 0;
}
JS题解代码
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function (line) {
// 输入
const input = line.trim();
const nums = input.split(',').map(Number);
const n = nums.length;
// 初始化左右两部分的和
let left_sum = 0, right_sum = nums.reduce((sum, num) => sum + num, 0);
// 遍历每个箱子,判断是否为黄金宝箱
let flag = false; // 是否找到黄金宝箱的标志
for (let i = 0; i < n; i++) {
if (i !== 0) { // 左部分的和不包括第一个数字
left_sum += nums[i - 1];
}
right_sum -= nums[i]; // 右部分的和不包括当前数字
if (left_sum === right_sum) { // 判断是否为黄金宝箱
console.log(i); // 输出黄金宝箱的编号
flag = true; // 找到了黄金宝箱
break; // 直接退出循环
}
}
// 输出结果
if (!flag) { // 如果没有找到黄金宝箱
console.log(-1); // 输出-1
}
});
代码OJ评判结果
通过测试点
代码讲解
Python题解代码讲解
- 导入模块: 首先导入了
sys
模块,用于标准输入。 - 输入: 通过
sys.stdin.readline().strip()
获取输入字符串,然后使用map
函数和split
方法将字符串转换为整数列表。 - 初始化左右两部分的和: 使用
left_sum
和right_sum
分别表示左右两部分的和,初始时右部分的和为整个数组的和。 - 遍历每个箱子: 通过循环遍历每个箱子,计算当前箱子左右两部分的和,然后判断是否为黄金宝箱。
- 输出结果: 如果找到黄金宝箱,则输出它的编号;否则,输出-1。
JAVA题解代码讲解
- 导入模块: 导入了
java.util.Scanner
和java.util.ArrayList
两个模块。 - 输入: 使用
Scanner
类获取输入字符串,然后通过split
方法将字符串分割成字符串数组,再将每个字符串转换为整数存入ArrayList
。 - 初始化左右两部分的和: 使用
left_sum
和right_sum
分别表示左右两部分的和,初始时右部分的和为整个数组的和。 - 遍历每个箱子: 通过循环遍历每个箱子,计算当前箱子左右两部分的和,然后判断是否为黄金宝箱。
- 输出结果: 如果找到黄金宝箱,则输出它的编号;否则,输出-1。
C/C++题解代码讲解
- 导入模块: 导入了
iostream
、string
、sstream
和vector
四个标准库。 - 输入: 使用
getline(cin, input)
获取输入字符串,然后通过stringstream
对象逐个获取数字并存入vector
。 - 初始化左右两部分的和: 使用
left_sum
和right_sum
分别表示左右两部分的和,初始时右部分的和为整个数组的和。 - 遍历每个箱子: 通过循环遍历每个箱子,计算当前箱子左右两部分的和,然后判断是否为黄金宝箱。
- 输出结果: 如果找到黄金宝箱,则输出它的编号;否则,输出-1。
JS题解代码讲解
- 导入模块: 使用Node.js的
readline
模块,创建一个readline
接口。 - 输入: 通过
rl.on('line', function (line)
监听输入,获取输入字符串,然后通过split
方法将字符串分割成数字数组。 - 初始化左右两部分的和: 使用
left_sum
和right_sum
分别表示左右两部分的和,初始时右部分的和为整个数组的和。 - 遍历每个箱子: 通过循环遍历每个箱子,计算当前箱子左右两部分的和,然后判断是否为黄金宝箱。
- 输出结果: 如果找到黄金宝箱,则输出它的编号;否则,输出-1。
寄语
🚀✨ 朋友,希望你的华为OD机试就像是一场轻松的技术party!愿你的代码如同畅快的音符,跳跃在键盘上,最后弹奏出一曲高分之歌。加油,你是技术舞台上的巨星!通过机试,就像是风轻云淡,轻轻松松就把高分收入囊中。祝愿你的编程之旅一路顺风,破风前行,每一行代码都是成功的注脚!🌈💻