寻找最大的葫芦

1,743 阅读2分钟

1. 问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 a 和另外两张相同牌面值的牌 b。如果两个人同时拥有“葫芦”,我们会优先比较牌 a 的大小,若牌 a 相同则再比较牌 b 的大小,牌面值的大小规则为:1 (A) > K > Q > J > 10 > 9 > ... > 2,其中 1(A) 的牌面值为1K13,依此类推。

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max

给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。

2. 解题方法(贪心法)

function solution(n, max, array) {
  // 统计每种牌面值的数量,并将A(1)转换为14
  const count = {};
  for (let card of array) {
    if (card === 1) {  // 将A的牌面值设为14,以便在后续计算中将其视为最大牌面值
      card = 14;
    }
    count[card] = (count[card] || 0) + 1;
  }

  // 获取所有不同的牌面值,并按降序排序
  const cards = Object.keys(count).map(Number).sort((a, b) => b - a);

  let bestCombo = [0, 0];

  // 尝试找到最佳的“葫芦”组合
  for (let i = 0; i < cards.length; i++) {
    let cardA = cards[i]; // 当前考虑的三条牌面值
    if (count[cardA] >= 3) { // 如果当前牌面值至少有三张
      for (let j = 0; j < cards.length; j++) {
        if (i === j) continue; // 确保三条和一对不是同一张牌
        let cardB = cards[j]; // 当前考虑的一对牌面值
        if (count[cardB] >= 2) { // 如果当前牌面值至少有两张
          let sum = 3 * (cardA === 14 ? 1 : cardA) + 2 * (cardB === 14 ? 1 : cardB);
          // 计算当前组合的总和,注意将14转换回1进行计算
          if (sum <= max) {
            bestCombo = [cardA, cardB];  // 更新最佳组合
            break;
          }
        }
      }
      if (bestCombo[0] !== 0) break; // 找到符合条件的组合后,跳出外层循环
    }
  }
  // 返回结果,并将14转换回1
  return [bestCombo[0] === 14 ? 1 : bestCombo[0], bestCombo[1] === 14 ? 1 : bestCombo[1]];
}