问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。
给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
测试样例
样例1:
输入:
n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
输出:[8, 5]
样例2:
输入:
n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
输出:[6, 9]
样例3:
输入:
n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
输出:[0, 0]
完整代码
import java.util.*;
public class Main {
// 自定义排序方法
public static void sortCustom(List<Integer> values) {
values.sort((o1, o2) -> {
if (o1 == 1) return 1; // 把 1 排到最后
if (o2 == 1) return -1; // 把其他数排到前面
return o1.compareTo(o2); // 降序排序
});
}
public static int[] solution(int n, int max, int[] array) {
// 统计每种牌面值的数量
Map<Integer, Integer> countMap = new HashMap<>();
for (int card : array) {
countMap.put(card, countMap.getOrDefault(card, 0) + 1);
}
// 删除数量 < 2 的牌
List<Integer> as = new ArrayList<>();
List<Integer> bs = new ArrayList<>();
Set<Integer> keySet = countMap.keySet();
for (Integer key : keySet) {
if (countMap.getOrDefault(key, 0) >= 2) {
bs.add(key);
}
if (countMap.getOrDefault(key, 0) >= 3) {
as.add(key);
}
}
// 让 as 和 bs 数组从大到小排列
sortCustom(as);
sortCustom(bs);
int[] arr = new int[]{0, 0};
for (int a : as) {
for (int b : bs) {
if(a == b){
continue;
}
if(a * 3 + b * 2 <= max) {
arr[0] = a;
arr[1] = b;
}
}
}
return arr;
}
public static void main(String[] args) {
// Add your test cases here
// System.out.println(java.util.Arrays.equals(solution(9, 34, new int[]{6, 6, 6, 8, 8, 8, 5, 5, 1}), new int[]{8, 5}));
System.out.println(java.util.Arrays.equals(solution(9, 37, new int[]{9, 9, 9, 9, 6, 6, 6, 6, 13}), new int[]{6, 9}));
// System.out.println(java.util.Arrays.equals(solution(9, 40, new int[]{1, 11, 13, 12, 7, 8, 11, 5, 6}), new int[]{0, 0}));
// System.out.println(java.util.Arrays.equals(solution(31, 42, new int[]{3, 3, 11, 12, 12, 2, 13, 5, 13, 1, 13, 8, 8, 1, 8, 13, 12, 9, 2, 11, 3, 5, 8, 11, 1, 11, 1, 5, 4, 2, 5}), new int[]{1, 13}));
// System.out.println(java.util.Arrays.equals(solution(25, 8, new int[]{10,13,9,5,12,10,13,7,1,2,13,3,7,1,5,10,1,5,7,1,7,8,13,10,5}), new int[]{0, 0}));
// System.out.println(java.util.Arrays.equals(solution(28, 104, new int[]{2,6,12,2,8,12,12,7,10,4,11,8,6,2,3,12,9,8,6,6,3,10,10,9,3,10,2,8}), new int[]{12, 10}));
System.out.println(java.util.Arrays.equals(solution(44, 36, new int[]{10,11,6,13,9,7,6,2,2,2,4,10,4,3,3,7,2,4,5,11,12,10,7,9,5,13,8,1,6,9,3,8,10,11,5,3,7,11,1,8,4,5,9,6}), new int[]{11, 1}));
//
}
}