找宝箱

题目描述:一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字和;第一个箱子左边部分的数字和定义为0;最后一个宝箱右边部分的数字和定义为0。请帮阿里巴巴找到黄金宝箱,输出第一个满足条件的黄金宝箱编号,如果不存在黄金宝箱,请返回-1"

输入描述

箱子上贴的数字列表,使用逗号分隔,例如:1,-1,0
宝箱的数量不小于1个,不超过10000
宝箱上贴的数值范围不低于-1000,不超过1000

输出描述

第一个黄金宝箱的编号

示例

示例1

输入
2,5,-1,8,6
输出
3
说明
下标3之前的数字和为:2+5+-1=6
下标3之后的数字和为:6

示例2

输入
8,9
输出
-1
说明
不存在符合要求的位置

示例3

输入
11
输出
0
说明
下标0之前的数字和为0
下标0之后的数字和为0

解题思路

  1. 第一个箱子左边部分的数字和定义为0;最后一个宝箱右边部分的数字和定义为0,所以设置左右侧初始值为0,left = 0,right = 0;
  2. 题目要求输出第一个满足条件的黄金宝箱编号,所以我们从左往右遍历;此时我们可以先将右侧总和求出(也就是数组总和),right = 20;
  3. 当 index = 0,left = 0 ,right = 20 - 2 = 18,不符合;
  4. 当 index = 1;left = 0 + 2,right = 18 - 5 = 13,不符合;
  5. 当 index = 2,left = 2 + 5 = 7,right = 13 - -1 = 14,不符合;
  6. 当 index = 3 ,left = 7 + -1 = 6,right = 14 - 8 = 6,符合,最终输出 index 为 3

代码

`public class Main{

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    String[] strings = sc.nextLine().split(",");
    int len = strings.length;
    int[] nums = Arrays.stream(strings).mapToInt(Integer::parseInt).toArray();

    //题目说:数组第一个元素的左侧和为0,最后一个元素的右侧和为0
    int left = 0, right = 0;
    for(int num : nums){
        right = right + num;    //数组的总和
    }
    
    //是否已经有满足条件的
    boolean flag =false;
    for(int i=0; i<len; i++){
        if(i!=0){
            left = left + nums[i-1];    //左侧和做加法
        }
        right = right - nums[i];    //右侧和做减法
        if(left == right){
            System.out.print(i);
            flag = true;
            break;
        }
    }
    if(!flag){
        System.out.println(-1);
    }
}

}`

posted @ 2023-11-01 17:47  约拿小叶  阅读(8)  评论(0编辑  收藏  举报