华为OD机考算法题:阿里巴巴找黄金宝箱(1)

题目部分

|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| | |
| 题目 | 阿里巴巴找黄金宝箱(1) |
| 难度 | 易 |
| 题目说明 | 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从 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 |
| 说明 | 不存在符合要求的位置。 |
| | |
| 示例2 | |
| 输入 | 11 |
| 输出 | 0 |
| 说明 | 下标 0 之前的数字之和为: 0。 下标 0 之后的数字之和为: 0。 |
| | |


解读与分析

题目解读:

一组整型数字,找出一个数字的下标,使其左边的数字之和等于右边数字之和。如果找不到输出 -1。

分析与思路:

此题思路比较简单,先计算所有数字之和,然后从小到大逐个遍历数字下标。在遍历过程中,如果下标左边的数字之和和下标右边的数字之和相等,则输出其下标。如果遍历完后,仍旧找不到,则输出 -1。

在遍历过程中,求左右之和时,只需要根据前一个下标的和计算增量即可,不需要全量计算。

在计算过程中,会遍历 2 次整型数字,第一次求和,第一次寻找符合要求的下标。时间复杂度为 O(n),空间复杂度为 O(n)。


代码实现

Java代码

java 复制代码
import java.util.Scanner;

/**
 * 阿里巴巴找黄金宝箱(1)
 * @since 2023.10.11
 * @version 0.1
 * @author Frank
 *
 */
public class AlibabaFindGold1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String input = sc.nextLine();
			String[] strNumber = input.split( "," );
			processAlibabaFindGold1( strNumber );
		}
	}

	private static void processAlibabaFindGold1( String[] strNumber )
	{
		int sum = 0;
		int[] numbers = new int[strNumber.length];
		for( int i = 0; i < strNumber.length; i ++ )
		{
			numbers[i] = Integer.parseInt( strNumber[i] );
			sum += numbers[i];
		}
		
		int leftSum = 0;
		int rightSum = sum;
		for( int i = 0; i < numbers.length; i ++ )
		{
			if( i >= 1 )
			{
				leftSum += numbers[ i - 1 ];
			}			
			rightSum -= numbers[i];
			if( leftSum == rightSum )
			{
				System.out.println( i );
				return;
			}
		}
		System.out.println( -1 );
	}
}

JavaScript代码

javascript 复制代码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        var strNumber = line.split(",");
        processAlibabaFindGold1(strNumber);
    }
}();

function processAlibabaFindGold1(strNumber) {
    var sum = 0;
    var numbers = new Array( strNumber.length );
    for (var i = 0; i < strNumber.length; i++) {
        numbers[i] = parseInt(strNumber[i]);
        sum += numbers[i];
    }

    var leftSum = 0;
    var rightSum = sum;
    for (var i = 0; i < numbers.length; i++) {
        if (i >= 1) {
            leftSum += numbers[i - 1];
        }
        rightSum -= numbers[i];
        if (leftSum == rightSum) {
            console.log(i);
            return;
        }
    }
    console.log(-1);
}

(完)

相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
吃好睡好便好3 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~3 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8294 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆4 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
Maimai108084 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
candyTong5 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm