大家好,我是哪吒。
做技术,我是认真的,立志于打造最权威的华为OD机试真题专栏,帮助那些与我有同样需求的人(考华为OD机试,升职加薪),每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
游乐场里增加了一批摇摇车,非常受小朋友欢迎,但是每辆摇摇车同时只能有一个小朋友使用,如果没有空余的摇摇车需要排队等候,
或者直接离开,最后没有玩上的小朋友会非常不开心。
请根据今天小朋友的来去情况,统计不开心的小朋友数量。
- 摇摇车数量为N,范围是1 <= N <= 10;
- 每个小朋友都对应一个编码,编码是不重复的数字,今天小朋友的来去情况,可以使用编码表示为:1 1 2 3 2 3。
(若小朋友离去之前有空闲的摇摇车,则代表玩耍后离开;不考虑小朋友多次玩的情况)。小朋友数量 <= 100; - 题目保证所有输入数据无异常且范围满足上述说明;
二、输入描述
第一行输入摇摇车的数量;
第二行输入小朋友来去情况;
三、输出描述
返回不开心的小朋友数量。
四、解题思路
- 输入摇摇车数量为N;
- 输入小朋友来去情况;
- 定义变量不开心的个数result;
- 定义一个集合,记录正在玩的小朋友;
- 定义一个集合,记录正在排队的小朋友;
- 遍历小朋友的来去情况;
- 如果正在玩,则表示此编号的小朋友玩好了,离开了;
- 如果有排队的小朋友,将第一个小朋友加入到正在玩的集合;
- 判断是否是排队的小朋友,没有玩到摇摇车,离开了就是不开心的,不开心result+1;
- 如果是新来的,摇摇车还有空位;
- 输出不开心的小朋友数量;
五、Java算法源码
package com.guor.od;
import java.util.Scanner;
import java.util.*;
public class OdTest01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 摇摇车数量为N
int N = Integer.parseInt(sc.nextLine());
// 小朋友来去情况
String[] arr = sc.nextLine().split(" ");
// 不开心的个数
int result = 0;
// 正在玩的小朋友
Set<String> playSet = new HashSet<>();
// 正在排队的小朋友
LinkedList<String> waitList = new LinkedList<>();
// 遍历小朋友的来去情况
for (String id : arr) {
// 如果正在玩
if (playSet.contains(id)) {
// 则表示此编号的小朋友玩好了,离开了
playSet.remove(id);
// 如果有排队的小朋友
if (waitList.size() > 0) {
// 将第一个小朋友加入到正在玩的集合
playSet.add(waitList.removeFirst());
}
// 遍历下一个
continue;
}
// 是否是排队的小朋友
int index = waitList.indexOf(id);
// 没有玩到摇摇车,离开了就是不开心的
if (index != -1) {
result++;
waitList.remove(index);
continue;
}
// 新来的情况
if (playSet.size() < N) {
// 摇摇车还有空位
playSet.add(id);
} else {
// 摇摇车没有空位
waitList.add(id);
}
}
System.out.println(result);
}
}
六、效果展示
1、输入
1
1 2 1 3 3 2
2、输出
1
3、说明
1来了,2来了 - 排队,1好了2上,3来了排队,3走了不开心,2好了。
输出不开心1个。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。