华为OD机试 - 篮球游戏 - 双端队列(Java 2024 D卷 100分)

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

幼儿园里有一个放倒的圆桶,它是一个线性结构,允许在桶的右边将篮球放入,可以在桶的左边和右边将篮球取出。

每个篮球有单独的编号,老师可以连续放入 一个或多个篮球,小朋友可以在桶左边或右边将篮球取出,当桶里只有一个篮球的情况下,必须从左边取出。

如老师按顺序放入1、2、3、4、5 共5个编号的篮球,那么小朋友可以依次取出的编号为“1,2,3,4,5”或者“3,1,2,4,5”编号的篮球,无法取出 “5,1,3,2,4” 编号的篮球。

其中“3,1,2,4,5”的取出场景为:

连续放入1,2,3号

从右边取出3号

从左边取出1号

从左边取出2号

放入4号

从左边取出4号

放入5号

从左边取出5号

简单起见,我们以L表示左,R表示右,此时的篮球的依次取出序列为“ RLLLL ”

二、输入描述

1、第一行的数字作为老师依次放入的篮球编号;

2、第二行的数字作为要检查是否能够按照放入顺序取出的篮球编号;

其中篮球编号用逗号进行分隔。

三、输出描述

对于每个篮球的取出序列,如果确实可以获取,请打印出其按照左右方向的操作的取出顺序,如果无法获取则打印"NO" 。

补充说明:

1<=篮球的编号,篮球个数<=200;

篮球上的数字不重复;

输出的结果中LR的必须为大写;

1、输入

4,5,6,7,0,1,2
6,4,0,1,2,5,7

2、输出

RLRRRLL

3、说明

篮球的取出顺序依次为 “右,左,右,右,右,左,左”

四、解题思路

为了实现这个功能,我们需要模拟一个双端队列来处理篮球的放入和取出操作,并根据输入序列生成相应的取出序列。如果无法按照给定顺序取出篮球,则输出“NO”。

  1. 输入解析:
    • 读取老师依次放入的篮球编号。
    • 读取小朋友要检查的取出顺序。
  2. 模拟操作:
    • 使用一个双端队列来模拟篮球桶的操作。
    • 遍历要检查的取出顺序,按顺序模拟取出操作,记录每次操作的方向(L或R)。
    • 每次取出后检查是否可以按照要求顺序进行操作,如果可以记录操作,否则返回“NO”。
  3. 输出结果:
    • 如果所有操作都能按顺序完成,输出记录的操作序列。
    • 如果无法完成,输出“NO”。

五、Java算法源码

public class Test01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取输入的放入序列和检查的取出序列
        String[] putInSeq = scanner.nextLine().split(",");
        String[] takeOutSeq = scanner.nextLine().split(",");

        // 将字符串数组转换为整数数组
        int[] putIn = Arrays.stream(putInSeq).mapToInt(Integer::parseInt).toArray();
        int[] takeOut = Arrays.stream(takeOutSeq).mapToInt(Integer::parseInt).toArray();

        // 模拟篮球桶的操作
        String result = getOrderSequence(putIn, takeOut);

        // 输出结果
        System.out.println(result);
    }

    // 获取取出操作序列
    public static String getOrderSequence(int[] putIn, int[] takeOut) {
        Deque<Integer> deque = new ArrayDeque<>();
        StringBuilder operations = new StringBuilder();
        int putIndex = 0; // 索引放入序列

        for (int ball : takeOut) {
            // 处理放入操作,直到当前取出球在队列中
            while (!deque.contains(ball) && putIndex < putIn.length) {
                deque.addLast(putIn[putIndex++]);
            }

            // 检查是否可以从左边或右边取出
            if (!deque.isEmpty() && deque.getFirst() == ball) {
                deque.removeFirst();
                operations.append("L");
            } else if (!deque.isEmpty() && deque.getLast() == ball) {
                deque.removeLast();
                operations.append("R");
            } else {
                return "NO";
            }
        }

        return operations.toString();
    }
}

六、效果展示

1、输入

4,5,6,7,0,1,2
6,4,0,1,2,5,7

2、输出

RLRRRLL

3、说明

篮球的取出顺序依次为 “右,左,右,右,右,左,左”
在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

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

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

在这里插入图片描述

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值