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