华为OD机试真题---幼儿园篮球游戏

华为OD机试真题中的“幼儿园篮球游戏”是一道有趣的逻辑模拟题。以下是该题目的详细描述及解题思路:

题目描述

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

例如,老师按顺序放入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. 第二行的数字作为要检查是否能够按照放入的顺序取出的篮球编号,也用逗号分隔。

备注:1≤篮球编号,篮球个数≤200,篮球上的数字不重复。

输出描述

对于每个篮球的取出序列,如果确实可以获取,请打印出其按照左右方向的操作取出顺序(用R和L表示),如果无法获取则打印“NO”。

示例

  • 示例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
    • 说明:不存在编号为5的篮球,所以无法取出对应编号的数据。

解题思路

这道题目属于模拟题,需要按照老师放入篮球的顺序和小朋友取出篮球的顺序来模拟篮球的放入和取出操作。主要思路是使用双端队列来模拟圆桶,并根据题目要求进行操作。

  1. 读取输入的老师放入篮球的顺序和小朋友取出篮球的顺序。
  2. 使用双端队列模拟圆桶,队列中存放篮球的编号。
  3. 循环进行操作,根据情况进行放入或取出操作,并记录操作序列。
  4. 如果最后队列为空,说明所有篮球都能够按照要求取出,输出操作序列;否则输出“NO”。

复杂度分析

  • 时间复杂度:设篮球个数为n,则时间复杂度为O(n)。
  • 空间复杂度:空间复杂度为O(n),主要由双端队列和输入篮球编号数组所占用的空间决定。

通过上述分析,可以清晰地理解题目要求及解题思路,并有效地解答该题目。

代码实现



import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

public class BasketballGame {

    
    
    /**
     * 判断是否能够按照指定的顺序取出篮球
     *
     * @param inputPut       表示放入篮球的顺序的字符串
     * @param inputRetrieve  表示尝试取出篮球的顺序的字符串
     * @return               如果能够按照指定顺序取出所有篮球,则返回操作序列,否则返回"NO"
     */
    public static String canRetrieveBalls(String inputPut, String inputRetrieve) {
        // 验证输入字符串
        if (inputPut == null || inputRetrieve == null || inputPut.isEmpty() || inputRetrieve.isEmpty()) {
            return "NO";
        }

        // 将输入的字符串转换为整数列表
        List<Integer> putList = convertToIntegerList(inputPut);
        List<Integer> retrieveList = convertToIntegerList(inputRetrieve);

        // 使用双端队列模拟圆桶
        Deque<Integer> deque = new LinkedList<>();

        // 记录操作序列
        StringBuilder operationSequence = new StringBuilder();

        // 遍历要取出的篮球列表
        for (int retrieve : retrieveList) {
            // 尝试取出篮球,如果失败则返回"NO"
            if (!tryRetrieve(deque, retrieve, operationSequence)) {
                return "NO";
            }

            // 如果还有篮球要放入且队列不为空(不是最后一个篮球),则继续放入
            if (!putList.isEmpty() && (deque.isEmpty() || !deque.peekLast().equals(putList.get(putList.size() - 1)))) {
                deque.offerLast(putList.remove(putList.size() - 1));
            }
        }

        // 检查是否所有篮球都已正确取出且没有剩余未放入的篮球
        if (deque.isEmpty() && putList.isEmpty()) {
            return operationSequence.toString();
        } else {
            return "NO";
        }
    }

    
    
    
    
    /**
     * 将逗号分隔的字符串转换为整数列表
     * 此方法选择逗号作为分隔符,因为它假设输入字符串中的数字以逗号分隔
     * 该方法不处理输入字符串中的空格或其他潜在的格式问题
     *
     * @param input 一个包含由逗号分隔的数字的字符串
     * @return 一个包含解析后的整数的列表
     * @throws NumberFormatException 如果字符串中的数字无法解析为整数,则抛出此异常
     */
    private static List<Integer> convertToIntegerList(String input) {
        // 分割输入字符串为数组
        String[] array = input.split(",");
        // 初始化整数列表
        List<Integer> list = new ArrayList<>();
        // 遍历数组,将每个字符串转换为整数并添加到列表中
        for (String s : array) {
            list.add(Integer.parseInt(s));
        }
        // 返回转换后的整数列表
        return list;
    }

    
    
    
    
    /**
     * 尝试从双端队列中取出特定的元素,并记录操作序列
     *
     * @param deque 双端队列,包含要取出的元素
     * @param retrieve 要取出的目标元素
     * @param operationSequence 记录操作序列的字符串构建器
     * @return 如果成功取出目标元素,则返回true;否则返回false
     */
    private static boolean tryRetrieve(Deque<Integer> deque, int retrieve, StringBuilder operationSequence) {
        boolean retrieved = false;

        // 尝试从右边取出
        if (!deque.isEmpty() && deque.peekLast() == retrieve) {
            deque.pollLast();
            operationSequence.append('R');
            retrieved = true;
        }

        // 尝试从左边取出(但注意当桶里只有一个篮球时必须从左边取出)
        if (!retrieved && (!deque.isEmpty() && deque.peekFirst() == retrieve || deque.size() == 1)) {
            deque.pollFirst();
            operationSequence.append('L');
            retrieved = true;
        }

        return retrieved;
    }

    public static void main(String[] args) {
        // 示例测试
        String inputPut1 = "4,5,6,7,0,1,2";
        String inputRetrieve1 = "6,4,0,1,2,5,7";
        System.out.println(canRetrieveBalls(inputPut1, inputRetrieve1)); // 输出: NO 或相应的正确序列,但注意此实现可能因策略不同而略有差异

        String inputPut2 = "4,5,6,7,0,1,2";
        String inputRetrieve2 = "6,0,5,1,2,4,7";
        System.out.println(canRetrieveBalls(inputPut2, inputRetrieve2)); // 输出: NO

        String inputPut3 = "1,2,3,4";
        String inputRetrieve3 = "1,2,3,5";
        System.out.println(canRetrieveBalls(inputPut3, inputRetrieve3)); // 输出: NO
    }
}

以上实现有问题,望大佬们指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DataWhale—PumpkinBook(TASK05决策树)

课程开源地址及相关视频链接&#xff1a;&#xff08;当然这里也希望大家支持一下正版西瓜书和南瓜书图书&#xff0c;支持文睿、秦州等等致力于开源生态建设的大佬✿✿ヽ(▽)ノ✿&#xff09; Datawhale-学用 AI,从此开始 【吃瓜教程】《机器学习公式详解》&#xff08;南瓜…

爱尔兰杀菌剂数据分析_1

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

捉虫笔记(七)-再探谁把系统卡住了

捉虫笔记&#xff08;七&#xff09;-再探谁把系统卡住 1、内核调试 在实体物理机上&#xff0c;内核调试的第一个门槛就是如何建立调试链接。 这里我选择的建立网络连接进行内核调试。 至于如何建立网络连接后续文章再和大家分享。 2、如何分析 在上一篇文章中&#xff0c;我们…

linux(redhat8)如何安装mysql8.0之rpmtar双版本(最新版)(内网)(离线)

一.环境 系统版本&#xff1a;Red Hat 8.5.0-20 Java环境&#xff1a;build 1.8.0_181-b13 MYSQL&#xff1a;8.x版本 二、查看内核版本 #查看内核版本&#xff0c;根据内核版本下载对应的安装包 cat /proc/version 三、安装方式 一、rpm包方式 一、下载安装包 1. 登录网…

【WRF后处理】WRF模拟效果评价及可视化:MB、RMSE、IOA、R

【WRF后处理】模拟效果评价及可视化 准备工作模型评价指标Python实现代码Python处理代码:导入站点及WRF模拟结果可视化图形及评价指标参考在气象和环境建模中(如使用 WRF 模型进行模拟),模型性能评价指标是用于定量评估模拟值与观测值之间偏差和拟合程度的重要工具。 本博客…

深度学习基础2

目录 1.损失函数 1.1 线性回归损失函数 1.1.1 MAE损失 1.1.2 MSE损失 1.1.3 SmoothL1Loss 1.2 CrossEntropyLoss 1.3 BCELoss 1.4. 总结 2.BP算法 2.1 前向传播 2.2 反向传播 2.2.1 原理 2.2.2. 链式法则 2.4 重要性 2.5 案例 2.5.1 数据准备 2.5.2 神经元计算…

STM32的CAN波特率计算

公式&#xff1a; CAN波特率 APB总线频率 / &#xff08;BRP分频器 1&#xff09;/ (SWJ BS1 BS2) SWJ一般为1。 例如STM32F407的&#xff0c;CAN1和CAN2都在在APB1下&#xff0c;频率是42000000 如果想配置成1M波特率&#xff0c;则计算公式为&#xff1a;

⭐ Unity 资源管理解决方案:Addressable_ Demo演示

一、使用Addressable插件的好处&#xff1a; 1.自动管理依赖关系 2.方便资源卸载 3.自带整合好的资源管理界面 4.支持远程资源加载和热更新 二、使用步骤 安装组件 1.创建资源分组 2.将资源加入资源组 3.打包资源 4.加载资源 三种方式可以加载 using System.Collections…

uniapp实现APP版本升级

App.vue 直接上代码 <script>export default {methods: {//APP 版本升级Urlupload() {// #ifdef APP-PLUSplus.runtime.getProperty(plus.runtime.appid, (info) > {// 版本号变量持久化存储getApp().globalData.version info.version;this.ToLoadUpdate(info.versi…

spark 写入mysql 中文数据 显示?? 或者 乱码

目录 前言 Spark报错&#xff1a; 解决办法&#xff1a; 总结一下&#xff1a; 报错&#xff1a; 解决&#xff1a; 前言 用spark写入mysql中&#xff0c;查看中文数据 显示?? 或者 乱码 Spark报错&#xff1a; Sat Nov 23 19:15:59 CST 2024 WARN: Establishing SSL…

欧科云链研究院:比特币还能“燃”多久?

出品&#xff5c; OKG Research 作者&#xff5c;Hedy Bi 本周二&#xff0c;隔夜“特朗普交易” 的逆转趋势波及到比特币市场。比特币价格一度冲高至约99,000美元后迅速回落至93,000美元以下&#xff0c;最大跌幅超6%。这是由于有关以色列和黎巴嫩有望达成停火协议的传闻引发…

27加餐篇:gRPC框架的优势与不足之处

gRPC作为一个现代的、开源的远程过程调用(RPC)框架,在多个方面都展现了其优雅之处,同时也存在一些不足之处。这篇文章我们就相对全面的分析一下gRPC框架那些优雅的地方和不足的地方。 优雅的地方 gRPC作为一个RPC框架,在编码、传输协议已经支持多语言方面都比较高效,下…

Spring MVC练习(前后端分离开发实例)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:二十五弦弹夜月&#xff0c;不胜清怨却飞来&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4…

重构项目架构

前言 我们上篇文章对整个项目进行一个整体的规划&#xff0c;其中对于APP类规划了类&#xff0c;本篇文章我们就来实现这个规划&#xff1b; class App {//加载页面constructor() {}//获取位置_getPosition() {}//接受位置_loadMap() {}//在地图上点击展现表单_showForm() {}/…

哈希C++

文章目录 一.哈希的概念1.直接定址法2.负载因子 二.哈希函数1.除法散列法 / 除留余数法2.乘法散列法3.全域散列法&#xff08;了解&#xff09; 三.处理哈希冲突哈希冲突&#xff1a;1.开放定址法&#xff08;1&#xff09;线性探测&#xff1a;&#xff08;2&#xff09;二次探…

转录组数据挖掘(生物技能树)(第11节)下游分析

转录组数据挖掘&#xff08;生物技能树&#xff09;&#xff08;第11节&#xff09; 文章目录 R语言复习转录组数据差异分析差异分析的输入数据操作过程示例一&#xff1a;示例二&#xff1a;示例三&#xff1a;此代码只适用于人的样本 R语言复习 #### 读取 ####dat read.deli…

Diving into the STM32 HAL-----Cyclic Redundancy Check笔记

在数字系统中&#xff0c;数据完全有可能被损坏&#xff0c;特别是当它流经通信介质时。在数字电子学中&#xff0c;消息是等于 0 或 1 的比特流&#xff0c;当这些比特中的一个或多个在传输过程中意外更改时&#xff0c;它就会损坏。因此&#xff0c;消息中始终有一些额外的数…

Swift——类与结构体

一.结构体 在swift的标准库中&#xff0c;大部分的类型都是结构体&#xff0c;比如&#xff1a;Int&#xff0c;Double&#xff0c;String&#xff0c;Array&#xff0c;Dictionary等等&#xff0c;它们都是结构体。 结构体定义如下&#xff1a; struct Person {var name:St…

反射泛型

反射 class 包含哪些内容&#xff1f; 当使用new 对象时需要构造函数是public 的&#xff0c;而当变成私有时再new则会报错 反射通过私有构造方法创建对象&#xff0c;破环单例模式 Clazz.getDeclared(构造函数&#xff0c;方法属性等)和直接get构造函数&#xff0c;方法属性等…

RHCE——SELinux

SELinux 什么是SELinux呢&#xff1f;其实它是【Security-Enhanced Linux】的英文缩写&#xff0c;字母上的意思就是安全强化Linux的意思。 SELinux是由美国国家安全局(NSA)开发的&#xff0c;当初开发的原因是很多企业发现&#xff0c;系统出现问题的原因大部分都在于【内部…