【华为OD题库-004】阿里巴巴找黄金宝箱1-Java

题目

---贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从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=6
示例2
输入:

8,9
输出:

-1
说明:

不存在符合要求的位置
示例3
输入:

11
输出:

0
说明:

下标0之前的数字和为:0

下标0之后的数字和为:0

思路

以2,5,-1,8,6为例,从索引0开始(start=0,值为2)开始,此时2左边的和left=0,右边的和right=5-1+8+6=18。

通过不断右移start,更新left和right的值后,判断left和right是否相等

如果找到left和right相等,那么直接返回此时的start

如果start走到最后一个元素,left依然不等于right,那么直接返回-1

至于更新left和right的逻辑,通过观察很容易发现:

left+=arrstart,start为右移动前的位置索引

right-=arrstart+1

题解

java 复制代码
package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class FindGoldBox {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] inputs=sc.nextLine().split(",");
        int[] boxs = Arrays.stream(inputs).mapToInt(Integer::parseInt).toArray();


        System.out.println(findGoldBox(boxs));
    }

    private static int findGoldBox(int[] boxs) {
        int start = 0, left = 0, right = 0;
        for (int i = 1; i < boxs.length; i++) {
            right += boxs[i];
        }
        while (left != right) {
            left += boxs[start];
            start++;
            if(start>=boxs.length) return -1;
            right -= boxs[start];

        }
        return start;
    }
}
相关推荐
牛奔3 小时前
Go 如何打印调试深层或嵌套的结构体
开发语言·后端·golang
geovindu4 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
学逆向的4 小时前
汇编——JCC指令
开发语言·汇编·网络安全
mayaairi5 小时前
JS循环语句深度解析:嵌套for、while与do...while
开发语言·前端·javascript
前端工作日常5 小时前
我学习到的Java中domain和dto区别
java·后端
kite01215 小时前
Go语言Map深度解析与最佳实践
开发语言·后端·golang
码农学院6 小时前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
技术小结-李爽6 小时前
【工具】pom文件的<packaging>
java·maven
l156469487 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
charlie1145141917 小时前
现代C++工程实践 WeakPtr 实战(三):WeakPtrFactory 与「最后成员」惯用法
开发语言·c++·开源项目·现代c++