java解法

解题步骤如下:

输入获取:

从输入中获取五张牌的点数(数字或字母)和花色。每张牌由一个数字(或字母表示的特殊牌,如 J, Q, K, A)和一个花色组成。
牌值转换:

将牌面上的字符(例如 J, Q, K, A)转换为数字值,方便后续排序和比较。
J 转换为 11
Q 转换为 12
K 转换为 13
A 转换为 14
数字牌保持不变。
分析牌型:

同花顺(Straight Flush):五张牌是连续的,并且花色相同。
四条(Four of a Kind):有四张相同的牌。
葫芦(Full House):有三张相同的牌和两张相同的牌。
同花(Flush):五张牌的花色相同。
顺子(Straight):五张牌是连续的,不考虑花色。
三条(Three of a Kind):有三张相同的牌。
返回结果:

根据不同的牌型,返回对应的数字编码。例如:同花顺返回 1,四条返回 2,葫芦返回 3,等等。如果不符合任何牌型,返回 0。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] nums = new String[5];   // 存储五张牌的点数
        String[] suits = new String[5];  // 存储五张牌的花色

        // 输入五张牌的点数和花色
        for (int i = 0; i < 5; i++) {
            nums[i] = sc.next();   // 输入点数
            suits[i] = sc.next();  // 输入花色
        }

        // 输出牌型结果
        System.out.println(getResult(nums, suits));
    }

    // 根据牌的点数和花色来判断牌型
    public static int getResult(String[] nums, String[] suits) {
        // 使用 TreeSet 存储牌的数值,保证自动排序
        TreeSet<Integer> values = new TreeSet<>();
        // 使用 Map 存储每个点数的出现次数
        Map<String, Integer> count = new HashMap<>();
        // 使用 Set 存储花色,判断是否同花
        Set<String> suitSet = new HashSet<>(Arrays.asList(suits));

        // 遍历所有牌,转换成数值并统计点数出现次数
        for (String num : nums) {
            int cardVal = cardValue(num);  // 将牌的点数转换为数值
            values.add(cardVal);           // 将牌数值加入到 TreeSet,自动排序
            count.put(num, count.getOrDefault(num, 0) + 1); // 更新点数出现次数
        }

        // 判断是否是同花:如果所有花色相同,则为同花
        boolean isFlush = suitSet.size() == 1;
        // 判断是否是顺子:如果牌的最大值与最小值差为 4 且牌数为 5,则为顺子
        // 或者特殊情况:A, 2, 3, 4, 5 也是顺子
        boolean isStraight = (values.last() - values.first() == 4 && values.size() == 5) || isLowAceStraight(values);

        // 牌型判断,从高到低:
        if (isStraight && isFlush) return 1; // 同花顺
        if (hasCount(count, 4)) return 2;    // 四条
        if (hasCount(count, 3) && hasCount(count, 2)) return 3;  // 葫芦
        if (isFlush) return 4;   // 同花
        if (isStraight) return 5;  // 顺子
        if (hasCount(count, 3)) return 6;   // 三条
        return 0;  // 没有符合的牌型
    }

    // 判断是否有某个点数出现 num 次
    private static boolean hasCount(Map<String, Integer> count, int num) {
        return count.containsValue(num);
    }

    // 判断是否是 A 2345 这种顺子(特殊情况)
    private static boolean isLowAceStraight(TreeSet<Integer> values) {
        return values.contains(14) && values.contains(2) && values.contains(3) && values.contains(4) && values.contains(5);
    }

    // 将牌的点数转换为数值
    private static int cardValue(String num) {
        switch (num) {
            case "J": return 11;  // Jack
            case "Q": return 12;  // Queen
            case "K": return 13;  // King
            case "A": return 14;  // Ace
            default: return Integer.parseInt(num);  // 其他牌是数字,直接返回数字
        }
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144834851"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!