1. 问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 a 和另外两张相同牌面值的牌 b。如果两个人同时拥有“葫芦”,我们会优先比较牌 a 的大小,若牌 a 相同则再比较牌 b 的大小,牌面值的大小规则为:1 (A) > K > Q > J > 10 > 9 > ... > 2,其中 1(A) 的牌面值为1,K 为 13,依此类推。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 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]];
}