石头剪刀布游戏 - 华为OD统一考试

news2024/10/7 16:23:06

OD统一考试

分值: 100分

题解: Java / Python / C++

alt

题目描述

石头剪刀布游戏有 3 种出拳形状: 石头、剪刀、布。分别用字母 A,B,C 表示游戏规则:

  1. 出拳形状之间的胜负规则如下: A>B; B>C; C>A; 左边一个字母,表示相对优势形状。右边一个字母,表示相对劣势形状。
  2. 当本场次中有且仅有一种出拳形状优于其它出拳形状,则该形状的玩家是胜利者。否则认为是平局。当发生平局,没有赢家。有多个胜利者时,同为赢家。

例如 1: 三个玩家出拳分别是A,B,C,由于出现三方优势循环(即没有任何一方优于其它出拳者),判断为平局。

例如 2: 两个玩家,出拳分别是 A,B,出拳 A的获胜。

例如 3: 三个玩家,出拳全部是 A,判为平局。

输入描述

在一场游戏中,每个玩家的信息为一行。玩家数量不超过 1000。

每个玩家信息有 2 个字段,用空格隔开:

  1. 玩家 ID:一个仅由 英文字母Q和数字组成的字符串。
  2. 出拳形状: 以英文大写字母表示,A、B、C 形状。

输出描述

输出为赢家的玩家 ID 列表(一个或多个),每个 ID 一行,按字符串升序排列。

如果没有赢家,输出为“NULL"字符串。

示例1

输入:
abc1 A
xyz B

输出:
abc1

说明:
A比B有优势,abc1 胜出。

示例2

输入:
abc1 A
xyz A

输出:
NULL

说明:
没有优胜的出拳形状,平局。

示例3

输入:
abc1 A
def A
alic A
xyz B

输出:
abc1
alic
def

说明:
A为优胜方,有三个赢家。

题解

解题思路

题目要求找出赢家的玩家 ID 列表,或者输出 “NULL”。首先,我们需要将玩家的信息按照出拳形状分组,即分成A、B、C三组。然后,判断每一组中是否有且仅有一种出拳形状优于其它出拳形状,如果是,则该组中的玩家是胜利者。最后,将胜利者的玩家 ID 按照字符串升序排列输出。

代码描述

  1. 使用三个列表A、B、C分别表示出拳形状为A、B、C的玩家。
  2. 遍历输入,根据出拳形状将玩家信息分组。
  3. 判断每一组中是否有且仅有一种出拳形状优于其它出拳形状,如果是,则该组中的玩家是胜利者。
  4. 将胜利者的玩家 ID 按照字符串升序排列输出;如果没有胜利者,输出"NULL"。

复杂度分析

时间复杂度:假设有n个玩家,遍历输入的时间复杂度为O(n)。

空间复杂度:使用了三个列表A、B、C来存储玩家信息,空间复杂度为O(n)。

Java

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<String> A = new ArrayList<>();
        List<String> B = new ArrayList<>();
        List<String> C = new ArrayList<>();

        while (scanner.hasNext()) {
            String user_id = scanner.next();
            String shape = scanner.next();
            if (shape.equals("A")) {
                A.add(user_id);
            } else if (shape.equals("B")) {
                B.add(user_id);
            } else {
                C.add(user_id);
            }
        }

        if (C.isEmpty() && !A.isEmpty() && !B.isEmpty()) {
            printResult(A);
        } else if (A.isEmpty() && !B.isEmpty() && !C.isEmpty()) {
            printResult(B);
        } else if (B.isEmpty() && !A.isEmpty() && !C.isEmpty()) {
            printResult(C);
        } else {
            System.out.println("NULL");
        }
    }

    private static void printResult(List<String> users) {
        Collections.sort(users);
        for (String user : users) {
            System.out.println(user);
        }
    }

}

IDEA 控制台结束输入使用 Ctrl + D

Python

import sys

A, B, C = [], [], []
for line in sys.stdin:
    user_id, shape = line.split()
    if shape == 'A':
        A.append(user_id)
    elif shape == 'B':
        B.append(user_id)
    else:
        C.append(user_id)


def print_result(users):
    users.sort()
    print(*users, sep="\n", end="")


if A and B and not C:   # 出 A 的人赢
    print_result(A)
elif B and C and not A:
    print_result(B)
elif C and A and not B:
    print_result(C)
else:
    print("NULL")

VS Code 控制台结束输入使用 Ctrl + Z

C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<string> A, B, C;
    string user_id, shape;

    while (cin >> user_id >> shape) {
        if (shape == "A") {
            A.push_back(user_id);
        } else if (shape == "B") {
            B.push_back(user_id);
        } else {
            C.push_back(user_id);
        }
    }

    auto printResult = [](const vector<string>& users) {
        vector<string> sortedUsers = users;
        sort(sortedUsers.begin(), sortedUsers.end());
        for (const auto& user : sortedUsers) {
            cout << user << endl;
        }
    };

    if (A.empty() && !B.empty() && !C.empty()) {
        printResult(B);
    } else if (B.empty() && !A.empty() &&  !C.empty()) {
        printResult(C);
    } else if (C.empty() && !A.empty() && !B.empty()) {
        printResult(A);
    } else {
        cout << "NULL" << endl;
    }

    return 0;
}

CodeBlocks 控制台结束输入使用 Ctrl + C

相关练习题

题号题目难易
LeetCode 13661366. 通过投票对团队排名中等
LeetCode 937937. 重新排列日志文件中等

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

Opencv(C++)学习之cv::calcHist 任意bin数量进行直方图计算

**背景&#xff1a;**当前网上常见的直方图使用方法都是默认使用256的范围&#xff0c;而对于使用特定范围的直方图方法讲的不够清楚。仔细研究后总结如下&#xff1a; 1、常见使用方法&#xff0c;直接对灰度图按256个Bin进行计算。 Mat mHistUn; int channels[1] { 0 }; {…

Django(五)

员工管理系统 1.新建项目 2.创建app python manage.py startapp app012.1 注册app 3. 设计表结构&#xff08;django&#xff09; from django.db import modelsclass Department(models.Model):""" 部门表 """title models.CharField(verbos…

Mysql 动态链接库配置步骤+ 完成封装init和close接口

1、创建新项目 动态链接库dll 2、将附带的文件都删除&#xff0c;创建LXMysql.cpp 3、项目设置 3.1、预编译头&#xff0c;不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…

【LeetCode-剑指offer】--15.找到字符串中所有字母异位词

15.找到字符串中所有字母异位词 方法&#xff1a;滑动窗口 class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans new ArrayList<>();int m s.length(),n p.length();if(n > m){return ans;}int[] cnt1 new i…

部署上传漏洞的靶场环境upload-labs

1、工具介绍 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 upload-labs靶场开源地址&#xff1a;&#xff1a;https://…

Android14之audit2allow自动生成Selinux规则(一百七十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

k8s的声明式资源管理

在k8s当中支持两种声明资源的方式&#xff1a; 1、 yaml格式&#xff1a;主要用于和管理资源对象 2、 json格式&#xff1a;主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件&#xff0c;所有的内容都…

使用GPTs+Actions自动获取第三方数据

目录 安装插件与GPT对话联网插件首先,创建GPTs。 Voxscript 官网:https://voxscript.awt.icu/index.htmlOpenAI Schema:https://voxscript.awt.icu/swagger/v1/swagger.yamlServer URL: servers: url: https://voxscript.awt.icu安装插件 要使用这个插件&

【Linux】set命令使用

set命令 设置所使用shell的执行方式&#xff0c;可依照不同的需求来做设置。 语法 set [参数]选项及作用 执行令 &#xff1a; man set 执行命令结果 参数 -a  标示已修改的变量&#xff0c;以供输出至环境变量。-b  使被中止的后台程序立刻回报执行状态。-C  转向所…

draw流程图工具导入云原生(CNCF)相关控件

目录 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 2、引用自己的资源链接&#xff1a; 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 导入资源图库&#xff0c;资源放在下方&#xff0c;大家可以下载&#xff1a; 2、引用自己的资源链接&#xff1a;…

全面PDF分析:创建PDF解析API,可商业用

为什么我要自己制作这个接口?需求如下: 我需要对PDF内容进行深入分析。无论是总结PDF内容,还是基于PDF内容提出问题,首先我都需要提取出文本信息。经过市场调查,我发现缺乏可靠的PDF解析API服务。即便是付费服务,也没有发现特别合适的产品,大多数都是现成的网站工具。文…

【LabVIEW FPGA入门】创建第一个LabVIEW FPGA程序

本教程仅以compactRIO&#xff08;FPGA-RT&#xff09;举例 1.系统配置 1.1软件安装 FPGA-RT 1. LabVIEW Development System (Full or Professional) 2. LabVIEW Real-Time Module 3. LabVIEW FPGA Module 4. NI-RIO drivers 1.2硬件配置 1.使用线缆连接CompactRIO至主机…

vue3(十三)-基础入门之路由配置与重定向

一、一级路由与重定向 1、创建 App.vue 在父组件中导入子组件 Navbar <template><div><navbar></navbar></div> </template><style lang"scss"></style><script> import navbar from /components/Navbarex…

[GKCTF 2020]cve版签到

[GKCTF 2020]cve版签到 wp 信息搜集 题目页面&#xff1a; 页面中有提示&#xff1a;You just view *.ctfhub.com 点一下 View CTFHub 会回弹一些信息&#xff1a; 抓包看看&#xff1a; url 传参&#xff0c;判断是 ssrf 。但是当我将其改为 http://www.baidu.com 或者是…

2024年PMP考试新考纲-【人员领域】真题解析

1前面的文章中&#xff0c;华研荟从PMBOK第七版介绍了里面的各个章节最新考纲下的PMP考试真题&#xff0c;并做了详细的解析。 从今天起&#xff0c;我们从另一个角度来看一下PMP的最新考试真题&#xff1a;从新考纲下的三个领域来看。 事实上&#xff0c;PMI官方于2019年6月…

RA-4565SA(汽车串行接口实时时钟模块)

RA-4565SA车载用 保证高温下正常工作-40C ~ 125C&#xff0c;数据保持判断功能&#xff0c;通过一个VL-bit值&#xff0c;可以判断备份后恢复的数据的有效性。32.768kHz频率输出功能&#xff0c;CLKOUT 引脚输出(开漏输出)&#xff0c;可选择输出频率为32.768kHz, 1024Hz, 32Hz…

Mars3d的BusineDataLayer应该传data格式实现聚合效果

问题&#xff1a; 1.通过【Mars3d】加载new mars3d.layer.BusineDataLayer(的如果不用url使用data的话&#xff0c;格式应该是什么样子的呢&#xff1f; 相关说明&#xff1a;实质就是就是GraphicLayer&#xff0c;自己加graphic进去。 使用data的话要否需要用onCreateGraph…

@EnableXXX注解+@Import轻松实现SpringBoot的模块装配

文章目录 前言原生手动装配模块装配概述模块装配的四种方式准备工作声明自定义注解 导入普通类导入配置类导入ImportSelector导入ImportBeanDefinitionRegistrar 总结TODO后续--条件装配 前言 最早我们开始学习或接触过 SSH 或者 SSM 的框架整合&#xff0c;大家应该还记得那些…

Python图像处理:批量添加水印的优雅实现与进阶技巧

1. 简介 在日常图像处理中&#xff0c;为图片添加水印是一项常见任务。有多种方法和工具可供选择&#xff0c;而今天我们将专注于使用Python语言结合PIL库批量添加水印。 需要注意的是&#xff0c;所选用的图片格式不应为JPG或JPEG&#xff0c;因为这两种格式的图片不支持透明…

vscode中增加参数的一个方法

1 在settings.json 文件中增加参数 2. 在参数中配置 这里也是ok的