1.问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小,牌面值的大小规则为:1 (A) > K > Q > J > 10 > 9 > ... > 2,其中 1 (A) 的牌面值为1,K 为13,依此类推。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。
给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
2.测试样例
样例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]
3.代码实现
值得注意的是1比13大,需要额外的处理逻辑,涉及的测试用例已在代码中补充
思路较为常规,暂无想到更好方案,有更好的方案欢迎评论
/**
* 1、将符合3个和2个的数字分别列出
* 2、利用数值数组自动从小到大排序的特性
* 3、将数字1也就是A用14替换,在涉及计算时(max)替换回去
* 4、得出二维数组最后一位也就是最大可选的
*/
function solution(n, max, array) {
if (n < 5) {
return [0, 0];
}
const obj = {}
array.forEach(sin => {
const curSin = sin === 1 ? 14 : sin
if (obj[curSin]) {
obj[curSin] += 1
} else {
obj[curSin] = 1
}
})
const fitThree = Object.keys(obj).filter(item => obj[item] > 2)
const fitTwo = Object.keys(obj).filter(item => obj[item] > 1)
const newArr = []
fitThree.forEach(item => {
fitTwo.forEach(ft => {
if (item !== ft) {
newArr.push([Number(item), Number(ft)])
}
})
})
if (newArr.length < 1) {
return [0, 0];
}
const result = newArr.filter(item => (item[0]=== 14 ? 1: item[0]) * 3 + (item[1]=== 14 ? 1: item[1]) * 2 <= max)
if (result.length < 1) {
return [0, 0];
}
const resultArr = result[result.length - 1]
return [resultArr[0]===14 ? 1: resultArr[0], resultArr[1]===14 ? 1: resultArr[1]]
}
function main() {
console.log(JSON.stringify(solution(31, 42, [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])) === JSON.stringify([1, 13]));
console.log(JSON.stringify(solution(25, 8, [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])) === JSON.stringify([0, 0]));
console.log(JSON.stringify(solution(37, 93, [6, 5, 5, 2, 5, 9, 6, 6, 10, 3, 9, 5, 7, 12, 8, 2, 3, 7, 7, 11, 8, 8, 9, 11, 10, 7, 3, 3, 10, 4, 11, 11, 9, 1, 1, 8, 2])) === JSON.stringify([11, 1]));
console.log(JSON.stringify(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1])) === JSON.stringify([8, 5]));
console.log(JSON.stringify(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13])) === JSON.stringify([6, 9]));
console.log(JSON.stringify(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6])) === JSON.stringify([0, 0]));
}
main();