阿里巴巴找黄金宝箱(I)
题目描述
一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。
黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字之和;
第一个箱子左边部分的数字和定义为0;最后一个箱子右边部分的数字和定义为0.
请帮阿里巴巴找到黄金宝箱,输出第一个满足条件的黄金宝箱编号,如果不存在黄金宝箱,请返回-1。
输入描述
箱子上贴的数字列表,使用逗号分隔,例如1,-1,0
宝箱的数量不小于1个,不超过10000
宝箱上贴的数值范围不低于-1000,不超过1000
输出描述
第一个黄金宝箱的编号
用例
输入 | 2,5,-1,8,6 |
输出 | 3 |
说明 | 下标3之前的数字和为:2 + 5 + -1 = 6 下标3之后的数字和为:6 = 6 |
输入 | 8,9 |
输出 | -1 |
说明 | 不存在符合要求的位置 |
输入 | 11 |
输出 | 0 |
说明 | 下标0之前的数字和为:0 下标0之后的数字和为:0 |
解析
理解题意 就如用例中所说,当只有一个箱子时,前后和为0,那么该箱子就是黄金箱子。若有多个时,则需要进行前后之和判断。若找不到合适的,那就返回-1,找到就返回箱子所在位置的索引。
import java.util.Arrays;
import java.util.Scanner;
public class T63 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int nums[] = new int[input.split(",").length];
if (nums.length == 1) {
System.out.println(0);
return;
}
int tempSum[] = new int[1];
int tempIndex[] = new int[1];
Arrays.stream(input.split(",")).forEach(item -> {
int no = Integer.parseInt(item);
nums[tempIndex[0]++] = no;
tempSum[0] += no;
});
int leftSum = 0;
int rightSum = tempSum[0];
for (int i = 1; i < nums.length; i++) {
leftSum += nums[i - 1];
rightSum -= nums[i - 1];
if (rightSum - nums[i] == leftSum) {
System.out.println(i);
return;
}
}
System.out.println(-1);
}
}
代码运行示例