最好的扑克手牌
难度:
标签:
题目描述
代码结果
运行时间: 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'时,你是如何确认所有牌具有相同的花色?能否详细解释这个过程?
▷🦆
为什么在确定'High Card'时,必须要求有五种不同的rank?如果其中两张牌rank相同,这种情况如何处理?
▷🦆
在判断'Three of a Kind'时,你是如何处理只有两张牌rank相同的情况?
▷🦆
请解释为什么在遍历Counter对象时,直接判断count大于2就可以返回'Three of a Kind',而不是检查是否存在两对或其他可能?
▷