华为OD机试真题 Java 实现【不开心的小朋友】【2023 B卷 100分】,附详细解题思路-LMLPHP

大家好,我是哪吒。

做技术,我是认真的,立志于打造最权威的华为OD机试真题专栏,帮助那些与我有同样需求的人(考华为OD机试,升职加薪),每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑

华为OD机试(JAVA)真题(A卷+B卷)

一、题目描述

游乐场里增加了一批摇摇车,非常受小朋友欢迎,但是每辆摇摇车同时只能有一个小朋友使用,如果没有空余的摇摇车需要排队等候,
或者直接离开,最后没有玩上的小朋友会非常不开心。

请根据今天小朋友的来去情况,统计不开心的小朋友数量。

  1. 摇摇车数量为N,范围是1 <= N <= 10;
  2. 每个小朋友都对应一个编码,编码是不重复的数字,今天小朋友的来去情况,可以使用编码表示为:1 1 2 3 2 3。
    (若小朋友离去之前有空闲的摇摇车,则代表玩耍后离开;不考虑小朋友多次玩的情况)。小朋友数量 <= 100;
  3. 题目保证所有输入数据无异常且范围满足上述说明;

二、输入描述

第一行输入摇摇车的数量;
第二行输入小朋友来去情况;

三、输出描述

返回不开心的小朋友数量。

四、解题思路

  1. 输入摇摇车数量为N;
  2. 输入小朋友来去情况;
  3. 定义变量不开心的个数result;
  4. 定义一个集合,记录正在玩的小朋友;
  5. 定义一个集合,记录正在排队的小朋友;
  6. 遍历小朋友的来去情况;
  7. 如果正在玩,则表示此编号的小朋友玩好了,离开了;
  8. 如果有排队的小朋友,将第一个小朋友加入到正在玩的集合;
  9. 判断是否是排队的小朋友,没有玩到摇摇车,离开了就是不开心的,不开心result+1;
  10. 如果是新来的,摇摇车还有空位;
  11. 输出不开心的小朋友数量;

五、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 实现【不开心的小朋友】【2023 B卷 100分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Java 实现【不开心的小朋友】【2023 B卷 100分】,附详细解题思路-LMLPHP

07-13 16:08