华为OD机试真题B卷 Python 实现【整理扑克牌】,附详细解题思路

在这里插入图片描述

目录

    • 一、题目描述
      • 步骤1
      • 步骤2
      • 步骤3
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Python算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

一、题目描述

给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理:

步骤1

对扑克牌进行分组,形成组合牌,规则如下:

  1. 当牌面数字相同张数大于等于4时,组合牌为“炸弹”;
  2. 3张相同牌面数字 + 2张相同牌面数字,且3张牌与2张牌不相同时,组合牌为“葫芦”;
  3. 3张相同牌面数字,组合牌为“三张”;
  4. 2张相同牌面数字,组合牌为“对子”;
  5. 剩余没有相同的牌,则为“单张”;

步骤2

对上述组合牌进行由大到小排列,规则如下:

  1. 不同类型组合牌之间由大到小排列规则:“炸弹” > “葫芦” > “三张” > “对子” > “单张”;
  2. 相同类型组合牌之间,除“葫芦”外,按组合牌全部牌面数字加总由大到小排列;
  3. “葫芦”则先按3张相同牌面数字加总由大到小排列,3张相同牌面数字加总相同时,再按另外2张牌面数字加总由大到小排列;
  4. 由于“葫芦”>“三张”,因此如果能形成更大的组合牌,也可以将“三张”拆分为2张和1张,其中的2张可以和其它“三张”重新组合成“葫芦”,剩下的1张为“单张”。

步骤3

当存在多个可能组合方案时,按如下规则排序取最大的一个组合方案:

  1. 依次对组合方案中的组合牌进行大小比较,规则同上;
  2. 当组合方案A中的第n个组合牌大于组合方案B中的第n个组合牌时,组合方案A大于组合方案B;

二、输入描述

5 2 5 4 1 3 4 3 3 2 5 4 5

三、输出描述

5 5 5 5 4 4 4 3 3 2 2 3 1

四、解题思路

  1. 首先,将输入的一组数字存储在一个List中,表示扑克牌的牌面数字;
  2. 创建一个HashMap map,用于统计每个牌面数字出现的次数;Key为牌面数字,Value为对应的次数;
  3. 将HashMap map 转换为List,并根据牌面数字的出现次数和牌面数字本身进行排序;排序规则为:
    • 如果两个牌面数字的出现次数相同,则按牌面数字本身从大到小排序;
    • 如果两个牌面数字的出现次数不同,则按出现次数从大到小排序;
  4. 创建一个StringBuilder builder,用于拼接排列后的扑克牌结果;
  5. 创建一个List splitList,用于存储拆分后的牌组中的"三张"的牌面数字;
  6. 遍历排序后的List,按照规则进行牌组的排列;
    • 如果遍历到的牌组是"葫芦"且之前有"三张",则拆分该"葫芦"为两个"对子"和一个"单张";
    • 如果遍历到的牌组是"单张"且之前有"葫芦"拆分的"单张",则与之前的"葫芦"中的"对子"组合为新的"葫芦";
    • 其他情况直接按照出现次数将牌面数字添加到StringBuilder builder中;
  7. 如果存在拆分后的"单张",将其按照牌面数字从大到小的顺序添加到StringBuilder builder中;
  8. 输出StringBuilder builder的内容作为结果;

五、Python算法源码

while 1:try:numList = list(map(int, input().split()))cache = {}for num in numList:if num not in cache:cache[num] = 0cache[num] += 1ret = []def setNum(key, val, count):global cacheglobal retret += [str(key)] * countcache[key] = val - countwhile len(ret) != len(numList):_cache = sorted(cache.items(), key=lambda x: (x[1], x[0]), reverse=True)if _cache[0][1]:if _cache[0][1] >= 4:setNum(*_cache[0], count=4)if _cache[0][1] == 3:setNum(*_cache[0], count=3)if _cache[1][1] >= 2:setNum(*_cache[1], count=2)if _cache[0][1] == 2:setNum(*_cache[0], count=2)if _cache[0][1] == 1:setNum(*_cache[0], count=1)print(" ".join(ret))except Exception as e:break

六、效果展示

1、输入

5 2 5 4 1 3 4 3 3 2 5 4 5

2、输出

5 5 5 5 4 4 4 3 3 2 2 3 1

3、说明

  1. “炸弹” > “葫芦” > “三张” > “对子” > “单张”;
  2. 由于“葫芦”>“三张”,因此如果能形成更大的组合牌,也可以将“三张”拆分为2张和1张,其中的2张可以和其它“三张”重新组合成“葫芦”,剩下的1张为“单张”。

5 5 5 5为炸弹

4 4 4 + 3 3 为葫芦,故将3 3 3 三张拆分。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统移植 kernel 移植 配置网卡IP NFS网络文件系统移植 7.4

给fs4412移植内核 Kernel(内核)是操作系统的核心组件,它负责管理计算机硬件和软件资源,提供对底层硬件的访问和控制,以及为应用程序提供运行环境。内核是操作系统的最底层,负责处理系统的各种任务和功能&a…

Docker学习笔记17

跨主机容器间网络: 实现跨主机容器间通信的工具: 1)Pipework 2)Flannel 3)Weave 4)Open V Switch (OVS) 5)Calico 1. Weave: 在每个宿主机上布置一个特…

ChatGPT:为教育创新提供五大机遇

随着智能技术的不断发展,ChatGPT在教育场景中的创新价值可能比我们能够意识到的还要多。比如它可以自动处理作业、在线答疑,可以辅助语言学习、实时沟通,甚至还可以用于评估诊断、科学研究。国内外关于利用ChatGPT实现教育创新的场景描绘已经…

论文浅尝 | 大语言模型综述

笔记整理:刘康为、方润楠,浙江大学硕士,研究方向为自然语言处理 链接:https://arxiv.org/abs/2303.18223 一、介绍 在当前机遇和挑战的背景下,对大语言模型的研究和开发需要更多的关注。为了让读者对大语言模型有一个基…

从零开始:如何用Python建立你的第一个人工智能模型

1. 摘要: 在这篇文章中,我们将介绍如何从零开始使用Python建立你的第一个人工智能模型。无论你是刚接触编程的新手,还是有经验的开发者想进一步探索人工智能领域,这篇文章都将为你提供清晰、详细的指南。我们将一步步探索数据预处…

matlab画拟合直方图的脚本

都是一些简单的作图参数,可以自己按照matlab官方的指导去改style https://ww2.mathworks.cn/help/stats/histfit.html %-----------------------------------------------------------------------------------------------------------% %-----Function: Plot a h…

解决阿里qiankun微应用资源无法加载

公司老项目多了,却想用新版本的框架,最好的解决办法就是用微前端。 本文说下我们在用阿里微前端框架qiankun,遇到的一些问题,以及一些巧妙的解决办法。 背景 因为接入微前端很长时间了,导致现在的微应用变成了实际意…

ikbc键盘2.4G接收器丢失,重新对码

我的键盘:ikbc W200 1.键盘关掉重开; 2.新接收器插在电脑上; 3.电脑上打开软件,点开始对码,一会就连接上了。 对码软件放在这里: 我用夸克网盘分享了「IKBC 对码.rar」,点击链接即可保存。打开…

进程(process)、线程(thread)、协程 (Coroutine) 的区别

说到协程(Coroutine),我们必须提到两个名称相似的东西。 在操作系统(os)级别,有进程(process)和线程(thread)两个(仅从我们常见的讲)实际的“东西”&#xff…

redis面试题

面试题汇总 Redis的使用场景什么是缓存穿透,有什么解决方案?能否介绍一下布隆过滤器布隆过滤器? 什么是缓存击穿 ? 怎么解决 ?什么是缓存雪崩 ? 怎么解决 ?redis做为缓存,mysql的数据如何与redis进行同步呢?&#…

【C++】C++11的新特性

文章目录 1. C11简介2. 统一的列表初始化2.1 {}统一初始化2.2 std::initializer_list 3. 声明的新方式和范围for循环3.1 decltype3.2 auto&nullptr&范围for循环 4. STL的变化4.1 新容器4.2 新接口 1. C11简介 ​ 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1…

MySQL中这些关键字的用法,佬们get到了嘛

前言: 最近粉丝问了一个问题,是关于Limit分页的用法,他没有理解清楚,因此本篇文章主要讲解MySQL的关键字的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c…