华为OD机试 - 石头剪刀布游戏(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

游戏规则:

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

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

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

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

二、输入描述

在一场游戏中,每个玩家的信息为一行。玩家数量不超过 1000 。每个玩家信息有 2 个字段,用空格隔开:

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

例如:

abc1 A

xyz B

解释:玩家 abc1 出拳为石头( A )。玩家 xyz 出拳为剪刀( B )

三、输出描述

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

例如:abc1

1、输入

abc1 A

xyz B

2、输出

abc1

3、说明

A 比 B 有优势,abc1 胜出

四、解题思路

要判断石头剪刀布游戏的赢家,首先需要理解游戏的规则。根据描述,玩家出拳有三种形状,分别用字母 A(石头)、B(剪刀)、C(布)表示。游戏规则是:

  • A > B(石头胜剪刀)
  • B > C(剪刀胜布)
  • C > A(布胜石头)

如果某种形状相对于其他形状有唯一的胜利者,则该形状的玩家获胜;否则为平局。

解决步骤

  1. 读取输入:
    • 读取每个玩家的信息,包括玩家ID和出拳形状。
  2. 统计出拳形状:
    • 统计每种出拳形状的玩家数量及其玩家ID。
  3. 判断胜利者:
    • 根据出拳形状数量判断是否存在唯一的胜者。
    • 如果某种出拳形状有唯一的胜利者,记录其玩家ID;如果没有唯一的胜利者,则为平局。
  4. 输出结果:
    • 如果存在赢家,按字符串升序输出玩家ID;如果没有赢家,输出 "NULL"。

五、Java算法源码

java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 存储玩家信息的列表,每个元素是一个包含玩家ID和出拳形状的数组
        List<String[]> players = new ArrayList<>();

        // 读取输入的每行数据,直到没有更多输入
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.isEmpty()) break; // 结束输入时跳出循环
            players.add(line.split(" ")); // 将玩家ID和出拳形状添加到列表
        }
        scanner.close(); // 关闭扫描器

        // 输出赢家的玩家ID列表,或者输出"NULL"
        System.out.println(findWinners(players));
    }

    public static String findWinners(List<String[]> players) {
        // 创建一个映射,用于存储每种出拳形状对应的玩家ID列表
        Map<Character, List<String>> shapeMap = new HashMap<>();
        shapeMap.put('A', new ArrayList<>());
        shapeMap.put('B', new ArrayList<>());
        shapeMap.put('C', new ArrayList<>());

        // 遍历所有玩家,统计每种出拳形状的玩家
        for (String[] player : players) {
            String playerId = player[0]; // 玩家ID
            char shape = player[1].charAt(0); // 出拳形状
            shapeMap.get(shape).add(playerId); // 将玩家ID添加到对应出拳形状的列表中
        }

        List<String> winners = new ArrayList<>(); // 用于存储赢家的玩家ID

        // 判断哪种出拳形状获胜
        if (shapeMap.get('A').size() > 0 && shapeMap.get('B').size() > 0 && shapeMap.get('C').size() == 0) {
            winners.addAll(shapeMap.get('A')); // A > B,且没有C,则A获胜
        } else if (shapeMap.get('B').size() > 0 && shapeMap.get('C').size() > 0 && shapeMap.get('A').size() == 0) {
            winners.addAll(shapeMap.get('B')); // B > C,且没有A,则B获胜
        } else if (shapeMap.get('C').size() > 0 && shapeMap.get('A').size() > 0 && shapeMap.get('B').size() == 0) {
            winners.addAll(shapeMap.get('C')); // C > A,且没有B,则C获胜
        }

        // 如果没有赢家,返回"NULL"
        if (winners.isEmpty()) {
            return "NULL";
        }

        // 按字典顺序排序赢家的玩家ID,并返回结果
        Collections.sort(winners);
        StringBuilder result = new StringBuilder();
        for (String winner : winners) {
            result.append(winner).append("\n"); // 将每个赢家的ID添加到结果中,每个ID占一行
        }

        return result.toString().trim(); // 去掉末尾多余的换行符
    }
}

六、效果展示

1、输入

abc1 A

def A

alic A

xyz B

2、输出

abc1

alic

def

3、说明

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

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
慧都小妮子39 分钟前
Spire.PDF for .NET【页面设置】演示:向 PDF 文档添加页码
java·pdf·.net
向宇it44 分钟前
【从零开始入门unity游戏开发之——C#篇16】C#什么是面向对象编程?
java·开发语言·vscode·unity·c#·游戏引擎
m0_694938011 小时前
Leetcode打卡:形成目标字符串需要的最少字符串数II
java·算法·leetcode
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇17】C#面向对象的封装——类(Class)和对象、成员变量和访问修饰符、成员方法
java·开发语言·vscode·unity·c#·游戏引擎
即将头秃的程序媛1 小时前
模版生成Word报表
java·报表
zhxueverme1 小时前
java面试八股文学习笔记
java·学习·面试
.生产的驴1 小时前
Dcoker Redis哨兵模式集群介绍与搭建 故障转移 分布式 Java客户端连接
java·大数据·数据库·redis·分布式·mysql·缓存
爱喝coffee的人2 小时前
关于SpringBoot中AOP的深入理解
java·开发语言·spring boot·后端·学习·spring
知识分享小能手2 小时前
Java学习教程,从入门到精通,Java ConcurrentHashMap语法知识点及案例代码(63)
java·大数据·开发语言·学习·intellij-idea·后端开发·java开发