news 2026/5/19 4:27:49

华为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/5/16 10:39:32

Windows系统文件dmenrollengine.dll损坏或丢失 下载修复

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

作者头像 李华
网站建设 2026/5/13 22:40:50

电力系统故障中的运行潮流分析与优化控制研究

电力系统故障运行潮流分析 搞电力系统的人都知道&#xff0c;系统故障时的潮流分析比正常工况刺激多了。就像你正吃着火锅唱着歌&#xff0c;突然变压器炸了&#xff0c;这时候要快速判断全网哪个节点电压会崩、哪条线路会过载&#xff0c;这时候故障潮流计算就是你的救命稻草…

作者头像 李华
网站建设 2026/5/18 15:35:33

Open-AutoGLM + JMeter组合拳,实现自动化压测的3倍效能提升

第一章&#xff1a;Open-AutoGLM 与 JMeter 组合压测的背景与意义 在当前人工智能与自动化测试深度融合的技术趋势下&#xff0c;大语言模型&#xff08;LLM&#xff09;驱动的测试工具逐渐成为提升软件质量保障效率的关键手段。Open-AutoGLM 作为一款基于开源大语言模型的自动…

作者头像 李华
网站建设 2026/5/11 1:57:40

企业级自动化测试工具选型难题(Open-AutoGLM与UFT Mobile终极PK)

第一章&#xff1a;企业级自动化测试工具选型的核心挑战在企业级应用系统日益复杂的背景下&#xff0c;自动化测试已成为保障软件质量的关键环节。然而&#xff0c;面对多样化的技术栈、多变的业务场景以及庞大的测试规模&#xff0c;企业在选择合适的自动化测试工具时面临诸多…

作者头像 李华
网站建设 2026/5/11 2:00:18

第 481 场周赛Q2——3784. 使所有字符相等的最小删除代价

题目链接&#xff1a;3784. 使所有字符相等的最小删除代价&#xff08;中等&#xff09; 算法原理&#xff1a; 解法&#xff1a;贪心 3ms击败100.00% 时间复杂度O(N) 正难则反&#xff0c;问题转化&#xff1a;保留总代价最大的字母&#xff0c;其余全删 方法&#xff1a;用数…

作者头像 李华