扑克牌“葫芦”问题 | 豆包MarsCode AI刷题

187 阅读3分钟

给定一定数量的扑克牌,从中找到符合“葫芦”规则的最大组合。一个“葫芦”由三张相同的牌 (a) 和两张相同的牌 (b) 组成。题目要求返回符合规则的最大“葫芦”组合,结果按照 [a, b] 的顺序输出(a 是三张牌,b 是两张牌)。如果找不到符合规则的组合,输出 [0, 0]


解题思路

  1. 统计牌的数量 使用数组 count(长度为 14,索引从 1 到 13 对应牌面)统计每种牌面出现的次数。这一步可以帮助我们快速判断某张牌是否可以组成三张或两张。

  2. 分类为三张和两张

    • 遍历 count 数组,如果某张牌的数量大于等于 3,则可以组成三张牌,将其加入 threeCards 列表。
    • 如果某张牌的数量大于等于 2,则可以组成两张牌,将其加入 twoCards 列表。
  3. 查找最大的“葫芦”组合

    • 遍历所有可能的 (a, b) 组合,其中 athreeCards 中的一个元素,btwoCards 中的一个元素。

    • 确保 a != b,因为三张牌和两张牌必须是不同的牌面。

    • 计算组合的总值 sum = 3 * a + 2 * b,检查是否满足限制条件 sum <= max

    • 按照优先级规则比较大小:

      • 优先选择三张牌面值大的组合。
      • 如果三张牌面值相等,再选择两张牌面值大的组合。
  4. 返回结果

    • 如果找到符合规则的组合,返回 [a, b]
    • 如果没有找到,返回 [0, 0]

import java.util.*;

public class Main { public static int[] solution(int n, int max, int[] array) { // 统计每种牌面出现的次数 int[] count = new int[14]; // 索引从1到13对应牌面 for (int card : array) { count[card]++; }

    List<Integer> threeCards = new ArrayList<>();
    List<Integer> twoCards = new ArrayList<>();

    // 根据次数分类为三张和两张
    for (int i = 13; i >= 1; i--) {
        if (count[i] >= 3) {
            threeCards.add(i); // 可以组成三张的牌面
        }
        if (count[i] >= 2) {
            twoCards.add(i); // 可以组成两张的牌面
        }
    }

    int bestA = 0; // 最好的三张牌的值
    int bestB = 0; // 最好的两张牌的值

    // 遍历所有三张和两张的组合,找到最优解
    for (int a : threeCards) {
        for (int b : twoCards) {
            if (a != b) { // 确保三张和两张是不同的牌面
                int sum = 3 * a + 2 * b; // 计算总值
                if (sum <= max) { // 确保满足总值限制
                    // 按优先级规则更新最佳组合
                    if (a > bestA || (a == bestA && b > bestB)) {
                        bestA = a;
                        bestB = b;
                    }
                }
            }
        }
    }

    // 如果没有找到合法的组合,返回 [0, 0]
    if (bestA == 0 && bestB == 0) {
        return new int[]{0, 0};
    }

    // 返回三张牌在前,两张牌在后的结果
    return new int[]{bestA, bestB};
}

public static void main(String[] args) {
    // 测试用例
    System.out.println(Arrays.equals(solution(9, 34, new int[]{6, 6, 6, 8, 8, 8, 5, 5, 1}), new int[]{8, 5}));
    System.out.println(Arrays.equals(solution(9, 37, new int[]{9, 9, 9, 9, 6, 6, 6, 6, 13}), new int[]{6, 9}));
    System.out.println(Arrays.equals(solution(9, 40, new int[]{1, 11, 13, 12, 7, 8, 11, 5, 6}), new int[]{0, 0}));
    System.out.println(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, 11, 1, 11, 1, 5, 4, 2, 5}), new int[]{1, 13}));
}

}