news 2026/4/18 12:07:14

华为OD机试真题 - 石头剪刀布游戏 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试真题 - 石头剪刀布游戏 (C++ Python JAVA JS GO)

石头剪刀布游戏

2025华为OD机试双机位B卷 - 华为OD上机考试双机位B卷 100分题型

华为OD机试双机位B卷真题目录点击查看: 华为OD机试双机位B卷真题题库目录|机考题库 + 算法考点详解

题目描述

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

游戏规则:

  1. 出拳形状之间的胜负规则如下:

    A > B;
    B > C;
    C > A;

    “>” 左边一个字母,表示相对优势形状。右边一个字母,表示相对劣势形状。

  2. 当本场次中有且仅有一种出拳形状优于其他出拳形状,则该形状的玩家是胜利者。否则认为是平局。

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

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

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

  3. 当发生平局,没有赢家。有多个胜利者时,同为赢家。

输入描述

在一场游戏中,每个玩家的信息为一行。玩家数量不超过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

输出

abc1

说明

A比B有优势,abc1胜出

用例2

输入

abc1 A xyz A

输出

NULL

说明

没有优胜的出拳形状,平局

用例3

输入

abc1 A def A alic A xyz B

输出

abc1 alic def

说明

A为优胜方,有三个赢家

题解

思路:逻辑分析

  1. 可以使用哈希表 / 二维数组存储各个手型的用户名称。
  2. 接下来分情况讨论得出结果:
    • 如果只出现一种手型 或者三种手型说明是平局,则直接输出NULL结束。
    • 出现两种手型的话,肯定有胜者,接下来分以下情况
      • 如果没有出现A,代表出现B C, 那么出B的就是胜者
      • 如果没有出现B,代表出现A C, 那么出C的就是胜者
      • 如果没有出现C,代表出现A B, 那么出A的就是胜者
  3. 如果存在胜者的话,将用户名按照字典序升序排序之后,输出结果即可。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vector<string> split(const string& str, const string& delimiter) { vector<string> result; size_t start = 0; size_t end = str.find(delimiter); while (end != string::npos) { result.push_back(str.substr(start, end - start)); start = end + delimiter.length(); end = str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } int main() { // 存储每个手型的名字 map<string, vector<string>> mapping; string input; while (getline(cin, input)) { if (input.empty()) { break; } vector<string> tmp = split(input, " "); mapping[tmp[1]].push_back(tmp[0]); } // 三个手型或者一个手型都是平局 if (mapping.size() == 3 || mapping.size() == 1) { cout << "NULL"; return 0; } vector<string> res; // 没有石头只有 剪刀/布 剪刀赢 if (mapping["A"].empty()) { res = mapping["B"]; // 没有剪刀只有 石头/布 布赢 } else if (mapping["B"].empty()) { res = mapping["C"]; // 没有布 只有剪刀/石头 石头赢 } else { res = mapping["A"]; } // 升序 sort(res.begin(), res.end()); // 输出结果 for (int i = 0; i < res.size(); i++) { cout << res[i] << endl; } return 0; }

JAVA

import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 存储每个手型对应的玩家名字 Map<String, List<String>> mapping = new HashMap<>(); String line; while ((line = br.readLine()) != null) { if (line.trim().isEmpty()) { break; } String[] arr = line.split(" "); String name = arr[0]; String type = arr[1]; mapping.putIfAbsent(type, new ArrayList<>()); mapping.get(type).add(name); } // 三种手型或只有一种手型,都是平局 if (mapping.size() == 3 || mapping.size() == 1) { System.out.print("NULL"); return; } List<String> res; // 没有石头(A),只有剪刀(B)/布(C),剪刀赢 if (!mapping.containsKey("A")) { res = mapping.get("B"); } // 没有剪刀(B),只有石头(A)/布(C),布赢 else if (!mapping.containsKey("B")) { res = mapping.get("C"); } // 没有布(C),只有石头(A)/剪刀(B),石头赢 else { res = mapping.get("A"); } // 按名字升序输出 Collections.sort(res); for (String s : res) { System.out.println(s); } } }

Python

importsysfromcollectionsimportdefaultdict# 存储每个手型对应的玩家名字mapping=defaultdict(list)# 读取输入,直到遇到空行或 EOFforlineinsys.stdin:line=line.strip()ifnotline:breakname,hand=line.split()mapping[hand].append(name)# 三种手型或只有一种手型,都是平局iflen(mapping)==3orlen(mapping)==1:print("NULL")sys.exit(0)# 判断胜者# 没有石头(A),剪刀(B)赢if"A"notinmapping:res=mapping["B"]# 没有剪刀(B),布(C)赢elif"B"notinmapping:res=mapping["C"]# 没有布(C),石头(A)赢else:res=mapping["A"]# 升序输出res.sort()fornameinres:print(name)

JavaScript

constreadline=require('readline');// readline 接收输入constrl=readline.createInterface({input:process.stdin,output:process.stdout});constlines=[];rl.on('line',line=>{lines.push(line.trim());});rl.on('close',()=>{// 存储每个手型对应的玩家名字constmapping=newMap();for(constlineoflines){if(line==='')break;const[name,hand]=line.split(' ');if(!mapping.has(hand)){mapping.set(hand,[]);}mapping.get(hand).push(name);}// 三种手型或只有一种手型,都是平局if(mapping.size===3||mapping.size===1){console.log("NULL");return;}letres;// 没有石头(A),剪刀(B)赢if(!mapping.has("A")){res=mapping.get("B");}// 没有剪刀(B),布(C)赢elseif(!mapping.has("B")){res=mapping.get("C");}// 没有布(C),石头(A)赢else{res=mapping.get("A");}// 按字典序升序res.sort();// 输出结果for(constnameofres){console.log(name);}});

Go

packagemainimport("bufio""fmt""os""sort""strings")funcmain(){in:=bufio.NewScanner(os.Stdin)// 存储每个手型对应的玩家名字mapping:=make(map[string][]string)// 逐行读取输入forin.Scan(){line:=strings.TrimSpace(in.Text())ifline==""{break}parts:=strings.Split(line," ")name:=parts[0]hand:=parts[1]mapping[hand]=append(mapping[hand],name)}// 三种手型或只有一种手型,都是平局iflen(mapping)==3||len(mapping)==1{fmt.Print("NULL")return}varres[]string// 没有石头(A),剪刀(B)赢if_,ok:=mapping["A"];!ok{res=mapping["B"]}elseif_,ok:=mapping["B"];!ok{// 没有剪刀(B),布(C)赢res=mapping["C"]}else{// 没有布(C),石头(A)赢res=mapping["A"]}// 升序排序sort.Strings(res)// 输出结果for_,name:=rangeres{fmt.Println(name)}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:34:13

CSP-J/S 2025 第一轮游记 _

觉这次 CSP 打的还可以&#xff0c;达到超过分数线 1010 分的目标了。希望复赛也能拿到可观的分数。当然&#xff0c;You have no egg!。考前三天考前三天。一到机房就和 yanzixuan2024 它们打术士&#xff0c;真不错。考前两天下午 4:00&#xff0c;竞赛生颁奖啦&#xff01;然…

作者头像 李华
网站建设 2026/4/18 8:39:50

Windows系统文件DWrite.dll丢失损坏问题 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/18 7:34:06

一文读懂字符与编码

整内容也可以在公众号「非专业程序员Ping」查看一、字符/Character对用户可见的“一个字符”&#xff0c;通常是我们在屏幕上看到的一个字母、数字、emoji 或组合字符。比如&#xff1a;a、、&#x1f468;‍&#x1f469;‍&#x1f467;‍&#x1f466;二、字符编码标准/字符…

作者头像 李华
网站建设 2026/4/18 8:36:15

8个AI写作工具,专科生轻松搞定毕业论文!

8个AI写作工具&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 写作工具&#xff0c;让论文不再难 对于许多专科生来说&#xff0c;撰写毕业论文不仅是一项学术任务&#xff0c;更是一场与时间、压力和知识储备的较量。面对繁重的写作任务&#xff0c;传统的写作方式往往效…

作者头像 李华
网站建设 2026/4/17 21:47:59

开题报告:从“过场文书”到“研究蓝图”的思维重构革命

开题报告&#xff0c;这个介于课程论文和毕业设计之间的学术任务&#xff0c;往往成为研究生学术生涯中的第一道“鬼门关”。它既不像课程论文那样可以“应付”&#xff0c;又不像毕业论文那样有明确的方向。据统计&#xff0c;超过60%的研究生会经历至少一次开题报告被退回修改…

作者头像 李华