目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、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。
四、解题思路
题目关键:
查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱子的编号之差的绝对值小于等于咒语数字。
- 第一行输入若干个箱子,箱子上贴的数字;
- 第二行输入咒语;
- 定义一个map,key:箱子上贴的数字,value:箱子编号;
- 遍历箱子上的数字集合;
- 将箱子上的数字和箱子序号加入map中;
- 如果两个箱子上贴的数字相同;
- 如果两个箱子的编号之差的绝对值小于等于咒语数字;
- 如果满足条件,输出第一次该数字箱子的编号;
- 如果不满足小于等于咒语数字,更新该数字的箱子的最左位置,再去比较下一个此数字的箱子;
- 如果没有符合条件的,如果不存在则返回-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 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。