幼儿园篮球游戏

题目描述:

幼儿园里有一个放倒的圆桶,它是一个 线性结构,允许在桶的右边将篮球放入,可以在桶的左边和右边将篮球取出。每个篮球有单独的编号,老师可以连续放入一个或多个篮球,小朋友可以在桶左边或右边将篮球取出,当桶只有一个篮球的情况下,必须从左边取出。

如老师按顺序放入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

输出:

RLRRRLL

说明:

篮球的取出顺序依次为"右、左、右、右、右、左、左"

示例2:

输入:

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

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

输出:

NO

示例3:

输入:

1,2,3,4

1,2,3,5

输出:

NO

题解

使用双端队列模拟,可以完成,输出结果

源码 Java

import java.util.*; // 导入Java的工具包,包含Scanner等类
 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in); 
        String line = in.nextLine();  // 读取第一行输入,即老师放入的篮球编号
        String[] numStrings = line.split(","); // 分割输入的字符串,获取篮球编号数组
        Deque<Integer> dq = new ArrayDeque<>(); // 使用双端队列来模拟篮球的放入和取出
        Queue<Integer> a = new LinkedList<>(); // 队列a用于存放篮球的初始放入顺序
        for (String x: numStrings)
            a.add(Integer.parseInt(x)); // 将字符串转为整数并放入队列a
        line = in.nextLine(); // 读取第二行,即要检查的取出顺序
        numStrings = line.split(",");
        int[] b = new int[numStrings.length]; // 数组b用于存放需要检查的取出顺序
        for (int i = 0; i < numStrings.length; i++)
            b[i] = Integer.parseInt(numStrings[i]); // 转换并存储到数组b
        
        StringBuffer res = new StringBuffer(); // 用于存储取出篮球的操作序列(左或右)
        boolean f = true; // 标志变量,表示是否可以按要求顺序取出篮球
        
        for (int x : b) { // 遍历要检查的取出顺序
            while (f) {
                if (dq.size() > 0 && dq.peekFirst() == x) { // 检查队首元素是否匹配
                    dq.pollFirst(); // 如果匹配,从队首取出
                    res.append("L"); // 记录操作为从左边取出
                    break;
                } else if (dq.size() > 0 && dq.peekLast() == x) { // 检查队尾元素是否匹配
                    dq.pollLast(); // 如果匹配,从队尾取出
                    res.append("R"); // 记录操作为从右边取出
                    break;
                } else if (a.size() > 0) {
                    dq.offerLast(a.poll()); // 如果当前队列中没有匹配的,继续从a中放入篮球到队尾
                } else {
                    f = false; // 如果无法继续放入,且没有找到匹配的篮球,设置f为false
                }
            }
            if (!f) // 如果已确定无法按要求取出,中断循环
                break;
        }
        System.out.println((f ? res.toString() : "NO")); // 根据f的值输出结果或“NO”
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坚定的小辣鸡在努力

你的支持是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值