华为OD机试 - 德州扑克 - 逻辑分析(Java 2023 B卷 200分)

news/2024/7/20 18:49:03 标签: 华为od, 七日集训, 学习, 德州扑克

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
      • 1、判断牌型
      • 2、说明
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
      • 3、说明
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

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

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

一、题目描述

五张牌,每张牌由牌大小和花色组成,牌大小2~10、J、Q、K、A,牌花色为红桃、黑桃、梅花、方块四种花色之一

1、判断牌型

牌型1,同花顺:同一花色的顺子,如红桃2红桃3红桃4红桃5红桃6。

牌型2,四条:四张相同数字+单张,如红桃A黑桃A梅花A方块A+黑桃K.

牌型3,葫芦:三张相同数字+一对,如红桃5黑桃5梅花5+方块9梅花9。

牌型4,同花:同一花色,如方块3方块7方块10方块J方块Q.

牌型5,顺子:花色不一样的顺子,如红桃2黑桃3红桃4红桃5方块6。

牌型6,三条:三张相同+两张单。

2、说明

  1. 五张牌里不会出现牌大小和花色完全相同的牌;
  2. 编号小的牌型较大,如同花顺比四条大,依次类推;
  3. 包含A的合法的顺子只有10JQKA和A2345;类似KA23的序列不认为是顺子。

二、输入描述

输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块。

三、输出描述

输出牌型序号,5张牌符合多种牌型时,取最大的牌型序号输出。

用例:

1、输入

4 H
5 S
6 C
7 D
8 D

2、输出

5

3、说明

可以组成45678,牌型5,顺子

四、解题思路

  1. 输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块。
  2. 特殊字符转换;
  3. 根据数值升序排序;
  4. 判断对手的牌型;
    • 默认为顺子,如果扑克牌不是自增的,判断不是顺子;
    • 默认为同花,如果扑克牌不是相同颜色,判断不是同花;
    • 定义map,存储对手的牌型,key:joker value:张数;
    • 特殊处理,2、3、4、5、A;
    • 判断四条、三条、葫芦;
  5. 组合判断牌型,按照牌型级别顺序输出。

五、Java算法源码

// 同花
private static boolean sameColor = true;
// 顺子
private static boolean dragon = true;
// 四条
private static boolean fourKind = false;
// 三条
private static boolean threeKind = false;
// 两条
private static boolean twoKind = false;

private static Map<String, Integer> jqkaMap = new HashMap<>();
static {
    jqkaMap.put("J", 11);
    jqkaMap.put("Q", 12);
    jqkaMap.put("K", 13);
    jqkaMap.put("A", 14);
}

/**
 * 输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,
 * 花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块。
 */
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    List<String[]> intList = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        intList.add(sc.nextLine().split(" "));
    }

    List<String[]> collect = intList.stream().map(x -> {// 特殊字符转换
        if (jqkaMap.containsKey(x[0])) {
            x[0] = String.valueOf(jqkaMap.get(x[0]));
        }
        return x;
    }).sorted(new Comparator<String[]>() {// 根据数值升序排序
        @Override
        public int compare(String[] o1, String[] o2) {
            Integer poker1 = jqkaMap.getOrDefault(o1[0], Integer.valueOf(o1[0]));
            Integer poker2 = jqkaMap.getOrDefault(o2[0], Integer.valueOf(o2[0]));
            return poker1 - poker2;
        }
    }).collect(Collectors.toList());

    // 判断牌型
    judgeJoker(collect);
    // 输出牌型
    System.out.println(judge());
}

// key:joker value:张数
static Map<Integer, Integer> map = new HashMap<>();
private static void judgeJoker(List<String[]> intList) {
    for (int i = 0; i < intList.size(); i++) {
        Integer poker = Integer.valueOf(intList.get(i)[0]);
        String color = intList.get(i)[1];
        if (i + 1 < intList.size()) {
            Integer next = Integer.valueOf(intList.get(i + 1)[0]);
            // 默认为顺子,如果扑克牌不是自增的,判断不是顺子
            if (dragon && !(++poker).equals(next)) {
                dragon = false;
            }

            // 默认为同花,如果扑克牌不是相同颜色,判断不是同花
            String nextColor = intList.get(i + 1)[1];
            if (sameColor && !color.equals(nextColor)) {
                sameColor = false;
            }
        }

        // key:joker value:张数
        Integer sum = map.getOrDefault(poker, 0);
        map.put(poker, ++sum);
    }

    // 特殊处理,2、3、4、5、A
    specialDragon(intList);

    List<Map.Entry<Integer, Integer>> mapList = new ArrayList<>(map.entrySet());
    mapList.stream().map(x -> {
        Integer sum = x.getValue();
        if (sum.equals(4)) {// 判断四条
            fourKind = true;
        }
        if (sum.equals(3)) {// 判断三条
            threeKind = true;
        }
        if (sum.equals(2)) {// 判断葫芦
            twoKind = true;
        }
        return x;
    }).collect(Collectors.toList());
}

// 特殊处理,2、3、4、5、A
private static void specialDragon(List<String[]> intList) {
    Integer first = Integer.valueOf(intList.get(0)[0]);
    Integer two = Integer.valueOf(intList.get(1)[0]);
    Integer three = Integer.valueOf(intList.get(2)[0]);
    Integer four = Integer.valueOf(intList.get(3)[0]);
    Integer five = Integer.valueOf(intList.get(4)[0]);
    if (first.equals(2) && two.equals(3) && three.equals(4) && four.equals(5) && five.equals(14)) {
        dragon = true;
    }
}

/**
 * 组合判断牌型,按照牌型级别顺序输出
 */
private static int judge() {
    if (dragon && sameColor) return 1;// 牌型1,同花顺
    if (fourKind) return 2;// 牌型2,四条
    if (threeKind && twoKind) return 3;// 牌型3,葫芦
    if (sameColor) return 4;// 牌型4,同花
    if (dragon) return 5;// 牌型5,顺子
    if (threeKind) return 6;// 牌型6,三条
    return 0;
}

六、效果展示

1、输入

10 H
J H
K H
A H
Q H

2、输出

1

3、说明

可以组成10JQKA, 花色相同,牌型1,同花顺

在这里插入图片描述


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

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

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

在这里插入图片描述


http://www.niftyadmin.cn/n/5124291.html

相关文章

Postman如何测试WebService接口

前言: 由于工作所需,需要使用Postman测试工具,对基于ws规范的WebService接口进行测试.在经过多种尝试后,终于找到了正确的测试方法.下面我便详细记录测试步骤,以便以后再次测试时可以拿来主义. 第一步:确保WebService服务端正常启动(注意服务端各个接口发布的url地址) 第二步…

UE5简化打包大小

UE5.3默认空项目带初学者包的打包后1G多 简化思路&#xff1a; 1.不打包初学者包&#xff08;或者创建时不包括初学者包&#xff0c;跳过第一条&#xff09; 导航&#xff1a;ProjectSettings->Project->Packaging->Packaging->Advanced->List of maps to incl…

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题&#xff0c;就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性&#xff0c;这里也需要详细记录下整个过程&#xff0c;明白的人不用看&#xff0c;可以直接跳过&#xff0c;到解决方法去…

pg 数据库,在新增的数据的时候,根据字段唯一性去更新数据

目录 1 问题2 实现 1 问题 在使用pg 数据库的时候&#xff0c;我们新增数据&#xff0c;希望如果有几个字段和数据库的一样&#xff0c;那么就更新数据&#xff0c;也就是在新增的时候&#xff0c;自动判断是否数据库有这个数据&#xff0c;有就更新&#xff0c;没有就新增 2…

java--跳转关键字和随机数

1.跳转关键字 break&#xff1a;跳出并结束当前所在循环的执行 continue&#xff1a;用于跳出当前循环的当次执行&#xff0c;直接进入循环的下一次执行 2.注意事项 break&#xff1a;只能用于结束所在循环&#xff0c;或结束所在switch语句的执行 continue&#xff1a;只能…

软件外包开发的代码质量控制

软件代码质量控制是确保软件项目成功的重要组成部分。以下是一些常见的软件代码质量控制方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.代码审查&#xff08;Code Review&#xff09; 通过定…

【linux系列】创建软连接

文章目录 作用命令创建软连接删除软链接修改软链接 参数 作用 现在服务器使用的时候&#xff0c;可视化界面仅显示固定目录下的内容&#xff0c;无法访问前序目录&#xff0c;导致查看内容非常麻烦&#xff0c;这时候软连接的作用就显现出来了&#xff0c;在当前目录下连接上&…

python爬虫之正则表达式解析实战

文章目录 1. 图片爬取流程分析2. 实现代码—爬取家常菜图片 1. 图片爬取流程分析 先获取网址&#xff0c;URL&#xff1a;https://www.xiachufang.com/category/40076/ 定位想要爬取的内容使用正则表达式爬取导入模块指定URLUA伪装&#xff08;模拟浏览器&#xff09;发起请求…