寻找最大葫芦

658 阅读3分钟

问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 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}));

        //

    }
}