leetcode
leetcode 2051 ~ 2100
最好的扑克手牌

最好的扑克手牌

难度:

标签:

题目描述

代码结果

运行时间: 22 ms, 内存: 16.0 MB


/*
 * 思路:
 * 1. 判断是否为同花(Flush):使用Stream的allMatch方法判断是否所有花色相同。
 * 2. 判断是否为三条(Three of a Kind)和对子(Pair):使用Collectors.groupingBy统计每个牌面的数量。
 */
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class BestHandStream {
    public static String bestHand(int[] ranks, char[] suits) {
        // 判断是否为同花
        boolean isFlush = Arrays.stream(suits).allMatch(suit -> suit == suits[0]);
        if (isFlush) return "Flush";

        // 统计每个牌面的数量
        Map<Integer, Long> rankCount = Arrays.stream(ranks)
                .boxed()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        // 判断是否为三条或对子
        boolean hasThreeOfAKind = rankCount.values().stream().anyMatch(count -> count >= 3);
        boolean hasPair = rankCount.values().stream().anyMatch(count -> count == 2);

        if (hasThreeOfAKind) return "Three of a Kind";
        if (hasPair) return "Pair";

        // 否则为高牌
        return "High Card";
    }
}

解释

方法:

此题解首先检查是否所有牌具有相同的花色,如果是,则直接返回'Flush',因为这是最好的手牌类型。若不是同花,则利用Counter来统计每个等级(rank)的牌出现的次数。首先判断如果有五种不同的rank,那么它必定是'High Card'。然后,遍历Counter中的键值对,检查是否存在出现次数大于2的牌,如果有,则返回'Three of a Kind'。如果上述条件都不满足,则表明至少有一对,返回'Pair'。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
在判断是否为'Flush'时,你是如何确认所有牌具有相同的花色?能否详细解释这个过程?
在Python中,可以通过创建花色的集合(set)来判断所有牌是否具有相同的花色。如果所有的牌都是同一花色,那么这个集合的大小(len)应该为1。例如,将所有牌的花色放入一个集合中,如果集合的长度为1,说明没有任何花色的不同,所有牌都是同一花色,因此返回'Flush'。
🦆
为什么在确定'High Card'时,必须要求有五种不同的rank?如果其中两张牌rank相同,这种情况如何处理?
在扑克牌中,'High Card'意味着没有任何更好的组合,只能依据单张牌的大小来比较。如果有五种不同的rank,则没有任何的对子、三条或其他任何类型的组合,因此是'High Card'。如果其中有两张或更多的牌rank相同,那么这不再是'High Card',而是至少是'Pair'或更高级别的手牌。因此,只有当所有五张牌的rank都不相同时,才满足'High Card'的条件。
🦆
在判断'Three of a Kind'时,你是如何处理只有两张牌rank相同的情况?
在判断'Three of a Kind'时,会检查Counter对象中是否有任何rank的数量超过2。只有当一个rank的计数值超过2时,才会返回'Three of a Kind'。如果只有两张牌rank相同,那么最大的计数值为2,这种情况下不会返回'Three of a Kind',而是继续检查是否至少有一对,从而可能返回'Pair'。
🦆
请解释为什么在遍历Counter对象时,直接判断count大于2就可以返回'Three of a Kind',而不是检查是否存在两对或其他可能?
在这种解法中,逻辑是尽快地确定手牌的最好可能性。'Three of a Kind'是比'Pair'或'High Card'更强的手牌。因此,如果发现有三张相同rank的牌,可以立即断定这是最好的可能手牌(在没有'Flush'的情况下),无需进一步检查是否存在两对。这种做法简化了逻辑并提高了效率,因为一旦确定了更高级别的手牌,就无需考虑较低级别的可能性。

相关问题