原题地址:寻找最大葫芦
题干如下:
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。
给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
由题我们不难发现,扑克牌的一串相同的数字最大的数量为 4 因此我们并不需要考虑牌aa与牌bb同时取到相同的扑克牌。
步骤一:
我选择的是使用哈希数组将array存入(set)新的map对象当中,再进行操作:
let map1 = new Map();
for (let i = 0; i < n; i++) {
map1.set(array[i], (map1.get(array[i]) || 0) + 1);
}
步骤二:
其次是创建一个对象数组,将得到的满足所有条件的所有牌aa与牌bb组成的对象属性存入到对象数组当中
对于牌aa需要满足至少拥有三个相同的value值
对于牌bb需要满足至少拥有个两相同的value值其次是需要判断牌aa×3+ 牌bb×2是否小于max,且牌aa!=牌bb
即可得到满足条件的所有的组合
let list = []
for (let [key1, value1] of map1) {
if (value1 >= 3) {
for (let [key2, value2] of map1) {
if (key2 != key1 && value2 >= 2) {
if (key1 * 3 + key2 * 2 <= max) {
list.push({ key1, key2 })
}
}
}
}
}
步骤三:
由于本题当中 1 的是最大的,但在数字大小当中它却又是最小的
我们可以通过调整 1 的实际数值的大小,达到使得 1 变成物理意义上的最大
我通过将 **1** 变成 14 达到想要的目的
for (let newlist of list) {
if (newlist.key1 == 1) {
newlist.key1 = 14
}
if (newlist.key2 == 1) {
newlist.key2 = 14
}
}
步骤四:
由于在list对象数组中存在许多不满足条件的数组,只需要对整个对象数组进行筛选即可
筛选条件是以牌aa的大小为优先选项
其次是当牌aa的大小是一致时,对牌bb的大小进行判断比较选出最大的牌bb
let maxobj = list[0]
for (let obj of list) {
if (obj.key1 > maxobj.key1 || (obj.key1 == maxobj.key1 && obj.key2 > maxobj.key2)) {
maxobj = obj
}
}
步骤五:
由于在步骤三当中为了达到 1 绝对意义的大,对 1 进行了修改操作
只需要将 14 改回成 1,即可完成本题
if (maxobj.key1 == 14) {
maxobj.key1 = 1
}
if (maxobj.key2 == 14) {
maxobj.key2 = 1
}