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

news2024/11/24 5:58:20

一、题目描述

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

步骤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的内容作为结果;

五、Java算法源码

public static void main(String[] args) {
    // 处理输入
    Scanner in = new Scanner(System.in);
    List<Integer> nums = Arrays.stream(in.nextLine().split(" "))
            .map(Integer::parseInt)
            .collect(Collectors.toList());

    //key:牌面点数,value:该点数的张数
    Map<Integer, Integer> map = new HashMap<>();
    for (int num : nums) {
        map.put(num, map.getOrDefault(num, 0) + 1);
    }

    // 先按张数排序,再按点数排序
    List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
    list.sort((a, b) -> {
        if (b.getValue() == a.getValue()) {
            return b.getKey() - a.getKey();
        }
        return b.getValue() - a.getValue();
    });

    StringBuilder builder = new StringBuilder();
    List<Integer> splitList = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
        Map.Entry<Integer, Integer> temp = list.get(i);
        int num = temp.getKey();
        int count = temp.getValue();
        // 由于“葫芦”>“三张”,因此如果能形成更大的组合牌,也可以将“三张”拆分为2张和1张,
        // 其中的2张可以和其它“三张”重新组合成“葫芦”,剩下的1张为“单张”。
        if (i > 0 && list.get(i - 1).getValue() == 3 && count == 3) {
            splitList.add(num);
            count = 2;
            temp.setValue(2);
        } else if (count == 1 && splitList.size() != 0) {
            for (int k = 0; k < splitList.size(); k++) {
                if (splitList.get(k) > num) {
                    builder.append(splitList.get(k) + " ");
                    splitList.remove(k);
                    k--;
                }
            }
        }
        for (int j = 0; j < count; j++) {
            builder.append(num + " ");
        }
    }

    if (splitList.size() != 0) {
        for (int i : splitList) {
            builder.append(i + " ");
        }
    }
    System.out.println(builder.substring(0, builder.length() - 1));
}

六、效果展示

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机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

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

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

相关文章

【Python Selenium】零基础也能轻松掌握的学习路线与参考资料

Python Selenium是一种基于Python编程语言的自动化测试框架&#xff0c;用于Web应用程序的测试和自动化。Python Selenium是一个非常流行的工具&#xff0c;它可以通过模拟用户行为来测试Web应用程序&#xff0c;同时还可以通过Python编写脚本实现自动化测试&#xff0c;并且可…

Spring Boot如何实现自定义Starter?

Spring Boot如何实现自定义Starter&#xff1f; 在 Spring Boot 中&#xff0c;Starter 是一种特殊的依赖&#xff0c;它可以帮助我们快速地集成一些常用的功能&#xff0c;例如数据库连接、消息队列、Web 框架等。在本文中&#xff0c;我们将介绍如何使用 Spring Boot 实现自…

python视频图片美化

python视频图片美化 git clone https://github.com/s0md3v/roop.git If you aren’t good with following commands, here’s a video tutorial install python (and pip too if neeed) install git install ffmpeg If you are on Windows, install “Microsoft Visual C 14”…

Cadence OrCAD Capture 搜索的到的元器件无法在图纸中找到的问题

🏡《总目录》 目录 1,概述2,问题现象3,问题原因解决方案4,总结B站关注“硬小二”浏览更多演示视频 1,概述 本文简单介绍在使用Capture绘图时,搜索元器件或其他对象,存在搜索结果,但在图纸中无法找到的原因和解决方案。 2,问题现象 如下图所示搜索U20后,存在搜索结果…

javascript基础十二:JavaScript中的事件模型如何理解?

一、事件与事件流 javascript中的事件&#xff0c;可以理解就是在HTML文档或者浏览器中发生的一种交互操作&#xff0c;使得网页具备互动性&#xff0c; 常见的有加载事件、鼠标事件、自定义事件等 由于DOM是一个树结构&#xff0c;如果在父子节点绑定事件时候&#xff0c;当触…

浅析Redis集群数据倾斜问题及解决方法

概 述 在服务端系统服务开发中&#xff0c;缓存是一种常用的技术&#xff0c;它可以提高系统对请求的处理效率&#xff0c;而redis又是缓存技术栈中的一个佼佼者&#xff0c;广泛的应用于各种服务系统中。在大型互联网服务中&#xff0c;每天需要处理的请求和存储的缓存数据…

【Java系列】Mybatis-Plus 使用方式介绍

1 Mybatis-Plus简介 Mybatis-Plus 提供了多种方式来执行 SQL&#xff0c;包括使用注解、XML 映射文件和 Lambda 表达式等。其中&#xff0c;使用 Lambda 表达式是 Mybatis-Plus 推荐的方式&#xff0c;因为它更加直观和类型安全。 2 使用方法 1 Lambda 表达式执行 SQL 以下是…

pix2pixHD---loss---损失函数

在Pix2PixHDModel代码中首先定义损失&#xff1a; 首先看第一个&#xff1a;输入的两个参数use_gan_feat_loss, use_vgg_loss默认为false&#xff0c;则前缀有not&#xff0c;所以两个参数都是True。 def init_loss_filter(self, use_gan_feat_loss, use_vgg_loss):flags (Tr…

PCIE知识点-022:PCIe 参考时钟结构

图1&#xff1a;参考时钟结构示意图[4] 1. Common Refclk Architecture Common Refclk Architecture&#xff0c;即同源参考时钟架构&#xff0c;PCIe收发设备共用一个时钟源&#xff0c;是目前是使用最为广泛的方案。 缺点&#xff1a; 对于适用同一 Common Clock 作为参考时…

第四章 运行时数据区

文章目录 前言一、&#x1f697; 双亲委派机制1、 问题的引出&#xff1a;是否会被外来程序对系统进行破坏2、总结3、双亲委派的优势4、沙箱安全机制5、其他 二、&#x1f692; 运行时数据区线程 三、&#x1f6fa; PC 寄存器概述&#xff08;记录下一条程序指令的地址&#xf…

Vulnhub: dpwwn: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.131 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.131 爆破出mysql的root用户为空密码 hydra -l root -P /usr/share/wordlists/rockyou.txt 192.168.111.131 -s 3306 mysq…

UI自动化 Xpath定位必知必会

目录 javascript xpath定位 定位单个元素&#xff1a; 定位多个元素&#xff1a; 验证xpath定位语法是否OK 尽量使用模糊匹配定位元素 模糊匹配contains 使用关联文本值定位 text() 在UI自动化测试中用的最频繁的就是xpath定位了&#xff0c;所以用好xpath定位至关重要&…

关于中断的几个小问题

1. intel 8259芯片中的IRQ2和int2的区别是什么&#xff1f; 答曰&#xff1a;IRQ2是芯片上的引脚&#xff0c;而int2是中断向量表的第2项&#xff0c;两者有很大区别。 Intel8259A芯片的中断引脚分别为&#xff1a; 主片&#xff1a; 0&#xff1a;8254时钟 1&#xff1a;键盘 …

【python代码】Kittle数据集的ground truth生成深度图攻略|彩色深度图|代码无恼运行

目录 1.明确KITTLE数据集特性 2.选择groundtruth 3.转换深度图 4.转换彩色深度图 1.明确KITTLE数据集特性 KITTI数据集包含了来自车载传感器的多模态数据&#xff0c;包括激光雷达、摄像头和GPS/惯性测量单元&#xff08;IMU&#xff09;等。该数据集主要采集于城市环境中…

B3645 数列前缀和 20

题目描述 给定一个长度为 n 的数列 a&#xff0c;请回答 q 次询问&#xff0c;每次给定 l,r&#xff0c;请求出 ()​mod p 的值&#xff0c;其中 p1,145,141。 输入格式 第一行是两个整数&#xff0c;依次表示数列长度 n 和询问次数 q。 第二行有 n 个整数&#xff0c;第 …

Qt下QTcpServer服务端识别多个QTcpSocket客户端

文章目录 Qt官方文档编写QTcpServerDemo和QTcpSocketDemo实现QTcpServerDemo实现QTcpSocketDemo 使用windeployqt生成程序运行所需依赖文件 Qt官方文档 QTcpSocket Class &#xff1a;https://doc.qt.io/qt-5/qtcpsocket.html QAbstractSocket Class&#xff1a;https://doc.q…

分布式RPC框架Dubbo详解

目录 1.架构演进 1.1 单体架构 1.2 垂直架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 2.RPC框架 2.1 RPC基本概念介绍 2.1.1 RPC协议 2.1.2 RPC框架 2.1.3 RPC与HTTP、TCP/ UDP、Socket的区别 2.1.4 RPC的运行流程 2.1.5 为什么需要RPC 2.2 Dubbo 2.2.1 Dub…

Redis的网络模型(未完成)

Redis是单线程还是多线程&#xff1f; 1)如果只是针对于Redis的核心业务部分(命令处理)&#xff0c;答案是单线程 2)如果是说整个redis&#xff0c;那么就是多线程 在Redis的版本迭代过程中&#xff0c;在两个非常重要的时间节点上引入了对多线程的支持: 1)在Redis4.0版本中&am…

redis第二章-第一课-持久化rdb和aof以及混合模式

RDB快照 1.在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中&#xff0c;默认存储在redis的当前目录下&#xff0c;也就是和redis.conf同级目录下&#xff0c;可以修改位置 2.你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据…

小白怎么入门CTF,看这个就够了(附学习笔记、靶场、工具包下载)

CTF靶场&#xff1a;CTF刷题&#xff0c;在校生备战CTF比赛&#xff0c;信安入门、提升自己、丰富简历之必备&#xff08;一场比赛打出好成绩&#xff0c;可以让你轻松进大厂&#xff0c;如近期的各种CTF杯&#xff09;&#xff0c;在职人员可以工作意外提升信安全技能。 渗透…