华为OD机试真题 Java 实现【斗地主之顺子】【2023 B卷 100分】,附详细解题思路-LMLPHP

一、题目描述

在斗地主扑克牌游戏中,扑克牌由小到大的顺序为: 3.4.5.6.7.8.9.10.J.Q.K A.2,玩家可以出的扑克牌阵型有: 单张、对子、顺子、飞机、炸弹等。

其中顺子的出牌规则为: 由至少 5 张由小到大连续递增的扑克牌组成,且不能包含 2。

例如: {3,4,5,6,7}、{13,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;而{J,Q,K,A,2}、{2,3,4,5,6}、
{3,4,5,6}.{3,4,5,6,8}等都不是顺子。

给定一个包含 13 张牌的数组,如果有满足出牌规则的顺子,请输出顺子

如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。

如果没有满足出牌规则的顺子,请输出 No。

二、输入描述

13 张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王

2 9 J 2 3 4 K A 7 9 A 5 6

不需要考虑输入为异常字符的情况

三、输出描述

组成的顺子,每张扑克牌数字用空格隔开。

四、Java算法源码

// 是否可以组成顺子
private static boolean flag = false;

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String[] input = sc.nextLine().split(" ");
    int[] arr = new int[input.length];
    for (int i = 0; i < arr.length; i++) {
        String tem = input[i];
        if (tem.equals("A")) {
            arr[i] = 14;
        } else if (tem.equals("J")) {
            arr[i] = 11;
        } else if (tem.equals("Q")) {
            arr[i] = 12;
        } else if (tem.equals("K")) {
            arr[i] = 13;
        } else {
            arr[i] = Integer.parseInt(tem);
        }
    }
    // 将扑克牌排序
    Arrays.sort(arr);
    int start = 0;
    int temp = 0;
    for (int i = 0; i < arr.length; i++) {
        // 2不能顺子
        if (arr[i] == 2) {
            continue;
        }

        if (start == 0) {
            start = arr[i];
            temp = arr[i];
            continue;
        }

        if (arr[i] == temp) {
            continue;
        }
        if (arr[i] == temp + 1) {
            temp = arr[i];
        } else {
            if (temp - start >= 4) {
                print(start, temp);
            }
            start = 0;
            temp = 0;
        }
    }
    if (temp - start >= 4) {
        print(start, temp);
    }
    if (!flag) {
        System.out.println("NO");
    }
}

private static void print(int start, int end) {
    flag = true;
    for (int j = start; j <= end; j++) {
        if (j == 14) {
            System.out.print("A ");
        } else if (j == 11) {
            System.out.print("J ");
        } else if (j == 12) {
            System.out.print("Q ");
        } else if (j == 13) {
            System.out.print("K ");
        } else {
            System.out.print(j + " ");
        }
    }
    System.out.println();
}

五、效果展示

1、输入

2 9 J 2 3 4 K A 7 9 A 5 6

2、输出

3 4 5 6 7

华为OD机试真题 Java 实现【斗地主之顺子】【2023 B卷 100分】,附详细解题思路-LMLPHP

3、再输入

5 9 Q 7 3 4 K A 10 J A 2 6

4、再输出

3 4 5 6 7
10 J Q K A

华为OD机试真题 Java 实现【斗地主之顺子】【2023 B卷 100分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

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

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

华为OD机试真题 Java 实现【斗地主之顺子】【2023 B卷 100分】,附详细解题思路-LMLPHP

06-07 10:05