题目描述:
幼儿园里有一个放倒的圆桶,它是一个 线性结构,允许在桶的右边将篮球放入,可以在桶的左边和右边将篮球取出。每个篮球有单独的编号,老师可以连续放入一个或多个篮球,小朋友可以在桶左边或右边将篮球取出,当桶只有一个篮球的情况下,必须从左边取出。
如老师按顺序放入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)); // 将字符串转为整数并放入队列aline = 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]); // 转换并存储到数组bStringBuffer 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”}
}