算法练习题目:问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 a a 和另外两张相同牌面值的牌 b b。如果两个人同时拥有“葫芦”,

在这里插入图片描述

文章目录


题目

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

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

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

测试样例
样例1:

输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
输出:[8, 5]
说明:array数组中可组成4个葫芦,分别为[6,6,6,8,8],[6,6,6,5,5],[8,8,8,6,6],[8,8,8,5,5]。其中[8,8,8,6,6]的牌面值为36,大于34不符合要求。剩下的3个葫芦的大小关系为[8,8,8,5,5]>[6,6,6,8,8]>[6,6,6,5,5],故返回[8,5]

样例2:

输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
输出:[6, 9]
说明:可组成2个葫芦,分别为[9,9,9,6,6]和[6,6,6,9,9],由于[9,9,9,6,6]的牌面值为39,大于37,故返回[6,9]

样例3:

输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
输出:[0, 0]
说明:无法组成任何葫芦,故返回[0,0]

样例4:

输入:n = 6, max = 50, array = [13, 13, 13, 1, 1, 1]
输出:[1, 13]
说明:可组成两个葫芦,分别为[A,A,A,K,K]和[K,K,K,A,A],两者牌面值都小于50,故都合法。因为三张相同牌面值的A > K,故[A,A,A,K,K]比[K,K,K,A,A]要大,返回[1,13]

答案

function solution(n, max, array) {
    // 统计每种牌面值的数量
    const count = {};

    for (let card of array) {
        if (card === 1) {  // 将A的牌面值设为14
            card = 14;
        }
        count[card] = (count[card] || 0) + 1;
    }

    // 对牌面值进行排序,从大到小
    const sortedCards = Object.keys(count).map(Number).sort((a, b) => b - a);

    // 遍历排序后的牌面值,尝试找到符合条件的“葫芦”组合
    for (let i = 0; i < sortedCards.length; i++) {
        const a = sortedCards[i];
        if (count[a] >= 3) {
            for (let j = 0; j < sortedCards.length; j++) {
                const b = sortedCards[j];
                if (a !== b && count[b] >= 2) {
                    let a1 = a;
                    if (a === 14) a1 = 1;  // 如果是14(即A),转换回1
                    let b1 = b;
                    if (b === 14) b1 = 1;  // 如果是14(即A),转换回1

                    // 检查组合的牌面值之和是否不超过给定的最大值
                    if ((3 * a1 + 2 * b1) <= max) {
                        return [a1, b1];
                    }
                }
            }
        }
    }

    // 如果没有找到符合条件的“葫芦”组合,返回 [0, 0]
    return [0, 0];
}

function main() {
    // Add your test cases here
    console.log(JSON.stringify(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1])) === JSON.stringify([8, 5])); // Expected: [8, 5]
    console.log(JSON.stringify(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13])) === JSON.stringify([6, 9])); // Expected: [6, 9]
    console.log(JSON.stringify(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6])) === JSON.stringify([0, 0])); // Expected: [0, 0]
    console.log(JSON.stringify(solution(6, 50, [13, 13, 13, 1, 1, 1])) === JSON.stringify([1, 13])); // Expected: [1, 13]
}

main();

您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶糖 肥晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值