寻找最大葫芦解题详解

原题地址:寻找最大葫芦

题干如下:

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。

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

由题我们不难发现,扑克牌的一串相同的数字最大的数量为 因此我们并不需要考虑牌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
    }


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值