【华为OD题库-020】阿里巴巴找黄金宝箱(III)-Java

news/2024/5/20 5:54:00 标签: java, 华为OD, 滑动窗口

题目

一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字。阿里巴巴念出一个咒语数字,查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱子的编号之差的绝对值小于等于咒语数字,如果存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1。
输入描述:
第一行输入一个数字字串,数字之间使用逗号分隔,例如: 1,2,3,1。字串中数字个数>=1, <=100000;每个数字值>= 100000,<= 100000:
第二行输入咒语数字,例如:3,咒语数字>=1, <=100000
输出描述:
存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1
示例1
输入:
6,3,1,6
3
输出:
0
示例2
输入:
5,6,7,5,6,7
2
输出:
-1

思路

题目翻译过来就是在一个区间(区间长度为咒语数字n+1)内,是否有存在编号相同的宝箱。比如示例1中,[0,3]区间存在相同的6(刚好在边界,位置0,和位置3),两个位置的差值为3,一定小于等于咒语3。所以返回左边箱子的编号0。而在示例二中,初始区间为[0,2],没有重复数字,将区间不断右移,依然找不到重复数字,所以返回-1.
定义变量:输入的宝箱数组为boxs,咒语为num。boxs的长度为len
使用right表示区间的右边界,遍历right:从0到len-1
左边界left=right-num
使用map记录某个数字出现的位置。在right遍历过程中,如果map中存在该数字,说明区间内有重复值,那么直接返回map中存的位置即可。如果不存在则向map中添加该数字的位置:map.put(boxs[right], right);
需要注意的是,我们需要动态维护区间,当right右移动的时候,left=right-num,也在右移,此时应该将left处的数字从map中删掉。由于right初始为0,left初始为-num,所以需要判断left大于等于0的时候,才对map左移出操作。
如果遍历完成后,还找不到重复的数字,那么直接返回-1。

题解

java">package hwod;

import java.util.*;

public class FindGoldBox3 {
    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();
        int num = sc.nextInt();


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


    private static int findGoldBox(int[] boxs,int num) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int right = 0; right < boxs.length; right++) {
            int left = right - num;
            if(map.containsKey(boxs[right])) return map.get(boxs[right]);
            map.put(boxs[right], right);
            if(left>=0) map.remove(boxs[left]);
        }
        return -1;
    }

}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.niftyadmin.cn/n/5179749.html

相关文章

为什么数据安全很重要?哪些措施保护数据安全?

数据安全很重要的原因是因为数据是现代社会的重要财产之一。很多组织和企业依赖数据来做出商业决策&#xff0c;管理客户关系&#xff0c;进行财务规划等等。如果这些数据泄露或遭到黑客攻击&#xff0c;那么就会影响企业的经济利益&#xff0c;甚至影响到个人的隐私和安全。此…

SwiftUI - 界面布局知识点

前言 SwiftUI采用的布局方式是和Flutter一样是弹性布局&#xff0c;而不是iOS之前的坐标轴的方式布局&#xff0c;不用准确的设置出位置大小&#xff0c;只需要设置当前视图大小及视图间排布的方式。灵活性增强&#xff0c;布局操作简便&#xff0c;SwiftUI与Flutter布局原理一…

AI技术如何融合应用于工业物联网

人工智能技术在近年来得到飞跃性地发展&#xff0c;在自主识别、分析、判断、规划等功能方面都进步显著&#xff0c;也已经应用于越来越多的行业产业。 在工业物联网领域&#xff0c;人工智能也将成为一大助力&#xff0c;通过与工业物联网系统集成融合&#xff0c;能够为工业…

用Go实现yaml文件节点动态解析

1.摘要 在大多数Go语言项目中, 配置文件通常为yaml文件格式, 在文件中可以设置项目中可灵活配置的各类参数, 通常这类参数都是比较固定的, 可以将其映射为对应的结构体在项目中进行使用, 如果需要调整参数时, 只需要增减结构体参数字段内容即可。 但同时还存在另外一种情况, …

中科驭数荣获北京市科学技术进步奖二等奖

近日&#xff0c;北京市人民政府发布京政发〔2023〕23号公告&#xff0c;2022年度北京市科学技术奖授奖清单揭晓&#xff0c;中国科学院计算技术研究所、北京控制工程研究所、中科驭数&#xff08;北京&#xff09;科技有限公司等产学研单位提报的“领域专用处理器关键技术及应…

【springboot】@restcontroller和@controller的区别

返回值不同&#xff1a;RestController注解的类中的所有方法都会返回JSON或XML等数据格式&#xff0c;而Controller注解的类中的方法可以返回JSP或HTML等视图页面。 默认注解不同&#xff1a;RestController注解中包含了ResponseBody注解&#xff0c;表示返回的数据会直接作为…

SMART PLC 和S7-1200PLC MODBUSTCP通信速度测试

SMART PLC MODBUSTCP通信详细介绍请参看下面文章链接: S7-200SMART PLC ModbusTCP通信(多服务器多从站轮询)_matlab sumilink 多个modbustcp读写_RXXW_Dor的博客-CSDN博客文章浏览阅读6.4k次,点赞5次,收藏10次。MBUS_CLIENT作为MODBUS TCP客户端通过S7-200 SMART CPU上的…

python数据结构与算法-00_课程简介之笨方法学算法

什么是算法和数据结构&#xff1f; 你可能会在一些教材上看到这句话&#xff1a; 程序 算法 数据结构 算法&#xff08;Algorithm&#xff09;&#xff1a;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解…