寻找最大葫芦解题详解

218 阅读3分钟

原题地址: 寻找最大葫芦 - MarsCode

笔者是使用js完成这次算法题目的编写。

题干如下:

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 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对象当中,再进行操作:

    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

即可得到满足条件的所有的组合

    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 达到想要的目的

      if (newlist.key1 == 1) {
        newlist.key1 = 14
      }
      if (newlist.key2 == 1) {
        newlist.key2 = 14
      }
    }

步骤四:

由于在list对象数组中存在许多不满足条件的数组,只需要对整个对象数组进行筛选即可

筛选条件是以牌aa的大小为优先选项

其次是当牌aa的大小是一致时,对牌bb的大小进行判断比较选出最大的牌bb

    for (let obj of list) {
      if (obj.key1 > maxobj.key1 || (obj.key1 == maxobj.key1 && obj.key2 > maxobj.key2)) {
        maxobj = obj
      }
    }

步骤五:

由于在步骤三当中为了达到 1 绝对意义的大,对 1 进行了修改操作

只需要将 14 改回成 1 ,即可完成本题

      maxobj.key1 = 1
    }
    if (maxobj.key2 == 14) {
      maxobj.key2 = 1
    }