华为OD机试真题 Java 实现【阿里巴巴找黄金宝箱(III)】【2023 B卷 100分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、那么问题来了,如果有两个满足的怎么办?

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

一、题目描述

一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0-N的箱子,每个箱子上面贴有一个数字。

阿里巴巴念出一个咒语数字,查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱子的编号之差的绝对值小于等于咒语数字。

如果存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1。

二、输入描述

第一行输入一个数字字串,数字之间使用逗号分隔,

例如: 1,2,3,1

  • 1 <= 字串中数字个数 <=100000

  • -100000 <= 每个数字值 <= 100000

第二行输入咒语数字,例如: 3

  • 1 <= 咒语数字 <= 100000

三、输出描述

存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1。

四、解题思路

题目关键:

查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱子的编号之差的绝对值小于等于咒语数字。

  1. 第一行输入若干个箱子,箱子上贴的数字;
  2. 第二行输入咒语;
  3. 定义一个map,key:箱子上贴的数字,value:箱子编号;
  4. 遍历箱子上的数字集合;
  5. 将箱子上的数字和箱子序号加入map中;
  6. 如果两个箱子上贴的数字相同;
    • 如果两个箱子的编号之差的绝对值小于等于咒语数字;
    • 如果满足条件,输出第一次该数字箱子的编号;
    • 如果不满足小于等于咒语数字,更新该数字的箱子的最左位置,再去比较下一个此数字的箱子;
  7. 如果没有符合条件的,如果不存在则返回-1。

五、Java算法源码

package com.guor.od;

import java.util.Scanner;
import java.util.*;
import java.util.HashMap;

public class OdTest01 {
    /**
     * 查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱子的编号之差的绝对值小于等于咒语数字
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 若干个箱子,箱子上贴的数字
        int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
        // 咒语
        int curses = Integer.valueOf(sc.nextLine());
        boolean flag = false;

        /**
         * key:箱子上贴的数字
         * value:箱子编号
         */
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            // 两个箱子上贴的数字相同
            if (map.containsKey(nums[i])) {
                // 两个箱子的编号之差的绝对值小于等于咒语数字
                if (i - map.get(nums[i]) <= curses) {
                    // 如果满足条件,输出第一次该数字箱子的编号
                    System.out.println(map.get(nums[i]));
                    return;
                } else {
                    // 更新该数字的箱子的最左位置,这个地方是关键
                    map.put(nums[i], i);
                }
            } else {
                /**
                 * key:箱子上贴的数字
                 * value:箱子编号
                 */
                map.put(nums[i], i);
            }
        }

        // 如果不存在则返回-1
        System.out.println(-1);
    }
}

六、效果展示

1、输入

1,2,3,4,3,2
2

2、输出

2

3、说明

查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱子的编号之差的绝对值小于等于咒语数字。
存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号。

第一行的箱子中有相同编号的有2(编号1和编号5)和3(编号2和编号4)
第二行咒语是2

两个箱子的编号之差的绝对值小于等于咒语数字,只有3号箱子满足,输出最左边箱子的编号2。

4、那么问题来了,如果有两个满足的怎么办?

1,2,3,4,3,2
5

第一行的箱子中有相同编号的有2(编号1和编号5)和3(编号2和编号4)
第二行咒语是5

两个箱子的编号之差的绝对值小于等于咒语数字,2号和3号箱子都满足。

按照题意,最先找到哪个,就算哪个,然后程序终止。

先找到的是3号箱子,输出最左边箱子的编号2即可。

是这样吗?来,打开idea,试一下,就知道了~~

华为OD机试真题 Java 实现【阿里巴巴找黄金宝箱(III)】【2023 B卷 100分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,学习,程序人生,spring,数据库)