• 华为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代码

    1. import java.util.Scanner;
    2. /**
    3. * 阿里巴巴找黄金宝箱(1)
    4. * @since 2023.10.11
    5. * @version 0.1
    6. * @author Frank
    7. *
    8. */
    9. public class AlibabaFindGold1 {
    10. public static void main(String[] args) {
    11. // TODO Auto-generated method stub
    12. Scanner sc = new Scanner(System.in);
    13. while (sc.hasNext()) {
    14. String input = sc.nextLine();
    15. String[] strNumber = input.split( "," );
    16. processAlibabaFindGold1( strNumber );
    17. }
    18. }
    19. private static void processAlibabaFindGold1( String[] strNumber )
    20. {
    21. int sum = 0;
    22. int[] numbers = new int[strNumber.length];
    23. for( int i = 0; i < strNumber.length; i ++ )
    24. {
    25. numbers[i] = Integer.parseInt( strNumber[i] );
    26. sum += numbers[i];
    27. }
    28. int leftSum = 0;
    29. int rightSum = sum;
    30. for( int i = 0; i < numbers.length; i ++ )
    31. {
    32. if( i >= 1 )
    33. {
    34. leftSum += numbers[ i - 1 ];
    35. }
    36. rightSum -= numbers[i];
    37. if( leftSum == rightSum )
    38. {
    39. System.out.println( i );
    40. return;
    41. }
    42. }
    43. System.out.println( -1 );
    44. }
    45. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var strNumber = line.split(",");
    7. processAlibabaFindGold1(strNumber);
    8. }
    9. }();
    10. function processAlibabaFindGold1(strNumber) {
    11. var sum = 0;
    12. var numbers = new Array( strNumber.length );
    13. for (var i = 0; i < strNumber.length; i++) {
    14. numbers[i] = parseInt(strNumber[i]);
    15. sum += numbers[i];
    16. }
    17. var leftSum = 0;
    18. var rightSum = sum;
    19. for (var i = 0; i < numbers.length; i++) {
    20. if (i >= 1) {
    21. leftSum += numbers[i - 1];
    22. }
    23. rightSum -= numbers[i];
    24. if (leftSum == rightSum) {
    25. console.log(i);
    26. return;
    27. }
    28. }
    29. console.log(-1);
    30. }

    (完)

  • 相关阅读:
    2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型(二)
    【NR 定位】3GPP NR Positioning 5G定位标准解读(十五)-UL-TDOA 定位
    Ansys Speos | SPEOS 在HUD杂光分析中的应用
    哪些自动化工具赋能电商运营效率翻倍?
    浅谈树状数组
    企业如何才能保证自身可持续发展
    java服装定制管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    bulldog 靶机
    【图像处理】基于直方图均衡化的图像轻微条纹检测(opencv实现)
    Tune-A-Video论文阅读
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/133738136