蓝桥杯第101题 拉马车 C++ Java Python

news2024/11/17 14:19:24

目录

题目

思路和解题方法

复杂度:

c++ 代码

Java 版本(仅供参考)

Python 版本(仅供参考)

代码细节

C++ 版本:

Java 版本:

Python 版本:


题目

思路和解题方法

这个游戏是一个简单的纸牌游戏,两个玩家轮流出牌,每个玩家从自己的牌堆中选择一张牌出牌,直到没有牌为止。具体步骤如下:

  1. 定义两个队列来存储玩家A和玩家B的牌堆。
  2. 玩家轮流出牌,每次出一张牌。
  3. 当任一玩家的牌堆为空时,游戏结束。
  4. 输出剩余的牌堆。

复杂度:

  • 时间复杂度: 代码只需遍历字符串一次,时间复杂度为 O(n),其中 n 是字符串的长度。
  • 空间复杂度: 使用了队列、栈和数组来存储字符,因此空间复杂度为 O(n)。

c++ 代码

#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <cstring> // 添加这一行来包含 <cstring> 头文件以使用 memset 函数
using namespace std;

queue<char> a, b; // 修改为队列存储字符
stack<char> s;
int check[256]; // 修改为使用数组存储字符出现情况

int main() {
    string aa, bb;
    int who = 1;
    cin >> aa >> bb;

    // 将字符串转换为队列
    for (int i = 0; i < aa.size(); i++) {
        a.push(aa[i]);
    }
    for (int i = 0; i < bb.size(); i++) {
        b.push(bb[i]);
    }

    while (!a.empty() && !b.empty()) {
        if (who == 1) {
            s.push(a.front());
            a.pop();
            if (check[s.top()]) {
                who = 1;
                char tmp = s.top();
                a.push(tmp); // 修正为将字符 tmp 压入队列 a
                s.pop();
                while (s.top() != tmp) {
                    a.push(s.top());
                    check[s.top()] = 0;
                    s.pop();
                }
                a.push(tmp);
                check[tmp] = 0;
                s.pop();
            }
            else {
                who = 2;
                check[s.top()] = 1;
            }
        }
        else {
            s.push(b.front());
            b.pop();
            if (check[s.top()]) {
                who = 2;
                char tmp = s.top();
                b.push(tmp); // 修正为将字符 tmp 压入队列 b
                s.pop();
                while (s.top() != tmp) {
                    b.push(s.top());
                    check[s.top()] = 0;
                    s.pop();
                }
                b.push(tmp);
                check[tmp] = 0;
                s.pop();
            }
            else {
                who = 1;
                check[s.top()] = 1;
            }
        }
    }
    while (!a.empty()) {
        cout << a.front();
        a.pop();
    }
    while (!b.empty()) {
        cout << b.front();
        b.pop();
    }
    return 0;
}

Java 版本(仅供参考)

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Queue<Character> a = new LinkedList<>();
        Queue<Character> b = new LinkedList<>();
        Stack<Character> s = new Stack<>();
        int[] check = new int[256];

        String aa = scanner.next();
        String bb = scanner.next();

        int who = 1;

        for (char c : aa.toCharArray())
            a.offer(c);

        for (char c : bb.toCharArray())
            b.offer(c);

        while (!a.isEmpty() && !b.isEmpty()) {
            if (who == 1) {
                s.push(a.poll());
                if (check[s.peek()] != 0) {
                    who = 1;
                    char tmp = s.peek();
                    a.offer(tmp);
                    s.pop();
                    while (s.peek() != tmp) {
                        a.offer(s.peek());
                        check[s.peek()] = 0;
                        s.pop();
                    }
                    a.offer(tmp);
                    check[tmp] = 0;
                    s.pop();
                } else {
                    who = 2;
                    check[s.peek()] = 1;
                }
            } else {
                s.push(b.poll());
                if (check[s.peek()] != 0) {
                    who = 2;
                    char tmp = s.peek();
                    b.offer(tmp);
                    s.pop();
                    while (s.peek() != tmp) {
                        b.offer(s.peek());
                        check[s.peek()] = 0;
                        s.pop();
                    }
                    b.offer(tmp);
                    check[tmp] = 0;
                    s.pop();
                } else {
                    who = 1;
                    check[s.peek()] = 1;
                }
            }
        }

        while (!a.isEmpty())
            System.out.print(a.poll());

        while (!b.isEmpty())
            System.out.print(b.poll());
    }
}

Python 版本(仅供参考)

from collections import deque

aa = input()
bb = input()

a = deque(aa)
b = deque(bb)
s = []
check = [0] * 256
who = 1

while a and b:
    if who == 1:
        s.append(a.popleft())
        if check[ord(s[-1])] != 0:
            who = 1
            tmp = s[-1]
            a.append(tmp)
            s.pop()
            while s[-1] != tmp:
                a.append(s[-1])
                check[ord(s[-1])] = 0
                s.pop()
            a.append(tmp)
            check[ord(tmp)] = 0
            s.pop()
        else:
            who = 2
            check[ord(s[-1])] = 1
    else:
        s.append(b.popleft())
        if check[ord(s[-1])] != 0:
            who = 2
            tmp = s[-1]
            b.append(tmp)
            s.pop()
            while s[-1] != tmp:
                b.append(s[-1])
                check[ord(s[-1])] = 0
                s.pop()
            b.append(tmp)
            check[ord(tmp)] = 0
            s.pop()
        else:
            who = 1
            check[ord(s[-1])] = 1

print(''.join(a) + ''.join(b))

代码细节:

C++ 版本:

  1. 使用 std::queue<char>std::stack<char> 分别代表队列和栈。这些数据结构需要包含 <queue><stack> 头文件。
  2. 使用 std::string 类型代表输入的字符串,字符串的读取使用 cin
  3. 使用 std::memset 函数需要包含 <cstring> 头文件。
  4. 使用 std::cout 输出结果。

Java 版本:

  1. 使用 java.util.Queue<Character>java.util.Stack<Character> 分别代表队列和栈。
  2. 使用 java.util.Scanner 类型进行输入。
  3. 使用 System.out.println() 输出结果。

Python 版本:

  1. 使用 collections.deque 代表队列。
  2. 使用列表代表栈。
  3. 使用 input() 函数进行输入。
  4. 使用 print() 函数输出结果。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot相关知识-图片描述(学习笔记)

学习java过程中的一些笔记&#xff0c;觉得比较重要就顺手记录下来了~ 目录 一、前后端请求1.前后端交互2.简单传参3.数组集合传参4.日期参数5.Json参数6.路径参数7.响应数据8.解析xml文件9.统一返回类10.三层架构11.分层解耦12.Bean的声明13.组件扫描14.自动注入 一、前后端请…

(免费分享)基于springboot,vue问卷调查系统

用户注册、用户登录、创建调查问卷、编辑问卷问题和选型&#xff08;支持题型&#xff1a;单选、多选、单行文本、多行文本、数字、评分、日期、文本描述&#xff09;、保存和发布问卷、停止问卷调查、游客填写调查问卷&#xff08;一个IP地址只能填写一次&#xff09; 技术&a…

4.3 IO day5

1&#xff1a;实现文件夹的拷贝功能 注意判断被拷贝的文件夹是否存在&#xff0c;如果不存在则提前创建&#xff0c;创建文件夹的函数为 mkdir 不考虑递归拷贝的问题 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h…

蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐

蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y,…

清明作业 c++

1.封装一个类&#xff0c;实现对一个数求累和阶乘质数 #include <iostream>using namespace std; int mproduct(int a){if(a>1){return a*mproduct((a-1));}else{return 1;} } class number{int a; public:number():a(5){};number(int a):a(a){}void set(int a){thi…

开源的页面生成器:拖拽即可生成小程序、H5页面和网站

星搭精卫 MtBird 是一款低代码可视化页面生成器&#xff0c;可以帮助用户以可视化的形式搭建网页、小程序和表单等应用。 使用这个生成器&#xff0c;不需要代码就可以生成小程序、H5页面和网站&#xff0c;拖拽操作、样式配置快速生成页面应用&#xff0c;数据可视化接入&…

2024年【道路运输企业安全生产管理人员】找解析及道路运输企业安全生产管理人员作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员找解析参考答案及道路运输企业安全生产管理人员考试试题解析是安全生产模拟考试一点通题库老师及道路运输企业安全生产管理人员操作证已考过的学员汇总&#xff0c;相对有效帮助道路运输…

C++高频面试知识总结 part3

哈希 1.哈希表为什么快&#xff1f;2.哈希冲突解决方法3.哈希表扩容流程4.哈希表扩容太多次&#xff0c;需要遍历所有元素&#xff0c;如何优化&#xff1f;5.渐进式扩容为何可以正确访问哈希表&#xff1f; 1.哈希表为什么快&#xff1f; 哈希表&#xff08;Hash table&#…

告别旧IP,更换网络ip地址教程分享

在数字化世界中&#xff0c;IP地址作为每个网络设备的标识符&#xff0c;扮演着至关重要的角色。它不仅是设备在网络中的“门牌号”&#xff0c;还影响着网络连接的稳定性、安全性和数据传输效率。因此&#xff0c;在某些情况下&#xff0c;更换网络IP地址成为必要操作。虎观代…

平台规则的改变会影响低价治理结果吗

许多品牌在做低价链接投诉时&#xff0c;会用一套自己的标准去做&#xff0c;但如果无视平台规则&#xff0c;会出现非常多不好的结果&#xff0c;比如帐号投诉成功率被拉低&#xff0c;会直接影响后续链接的投诉时效和成功率&#xff0c;同时因为不尊重平台规则&#xff0c;而…

美国洛杉矶大带宽服务器带宽堵塞解决方法

随着互联网的快速发展&#xff0c;大带宽服务器成为了现代企业和个人进行数据传输、存储和处理的关键设施。然而&#xff0c;在美国洛杉矶等大城市&#xff0c;由于网络流量的激增、不合理的网络配置以及网络攻击等多种原因&#xff0c;大带宽服务器带宽堵塞问题日益凸显。本文…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…

基于springboot+vue+Mysql的教学视频点播系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

洛谷 1126.机器人搬重物

思路&#xff1a;BFS 这道BFS可谓是细节爆炸&#xff0c;对于编程能力和判断条件的能力的考察非常之大。 对于这道题&#xff0c;我们还需要额外考虑一些因素&#xff0c;那就是对于障碍物的考虑和机器人方位的考虑。 首先我们看第一个问题&#xff0c;就是对于障碍物的考虑…

Qt Creator 界面

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、认识 Qt Creator 界面 1、总览 2、左边栏 3、代码编辑区 4、UI设计界面 5、构建区 一、认识 …

GitHub入门与实践

ISBN: 978-7-115-39409-5 作者&#xff1a;【日】大塚弘记 译者&#xff1a;支鹏浩、刘斌 页数&#xff1a;255页 阅读时间&#xff1a;2023-08-05 推荐指数&#xff1a;★★★★★ 好久之前读完的了&#xff0c;一直没有写笔记。 这本入门Git的书籍还是非常推荐的&#xff0c;…

【蓝桥杯】蓝桥杯算法复习(四)

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

深入浅出 -- 系统架构之Keepalived搭建双机热备

Keepalived重启脚本双机热备搭建 ①首先创建一个对应的目录并下载keepalived安装包&#xff08;提取码:s6aq&#xff09;到Linux中并解压&#xff1a; [rootlocalhost]# mkdir /soft/keepalived && cd /soft/keepalived [rootlocalhost]# wget https://www.keepalived.…

ROS2 采集虚拟仿真环境图像并发布

简介&#xff1a;ROS2功能的学习我们还是在基于OpenAI的gym虚拟仿真环境中来完成&#xff0c;gym虚拟仿真环境安装请参考另一篇教程&#xff0c;这里不再重复说明&#xff0c;接下来我们开始创建一个ROS2的功能节点&#xff0c;并发布虚拟仿真环境小车摄像头的图像&#xff0c;…

Android Studio 打开Local Changes界面

在编写代码的过程中&#xff0c;经常要回顾本地仓库做了那些修改。打开Local Changes界面&#xff0c;能做到一目了然&#xff0c;不用再去使用git命令查看。 File->Settings->Version control->Commit 把Use non-modal commit interface 选项 取消勾选 即可