寻找最大葫芦|豆包MarsCode AI刷题

44 阅读4分钟

问题描述

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

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

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


测试样例

样例1:

输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
输出:[8, 5]

样例2:

输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
输出:[6, 9]

样例3:

输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
输出:[0, 0]

代码:

def solution(n, max, array):
# Edit your code here
array.sort(reverse = True)
num_one = array.count(1)
while 1 in array:
    array.remove(1)
for i in range(num_one):
    array.insert(0, 1)
num = {}
for i in array:
    num[i] = num.get(i, 0) + 1
re = [0, 0]
print(num) 
for k in num:
    f = False
    if num.get(k) >= 3:
        re[0] = k
        for kk in  num:
            if kk != k and num.get(kk) >= 2:
                re[1] = kk
                if 3 * re[0] + 2 * re[1] <= max:
                    f = True
                    break
        if f:
            break
else:
    re = [0, 0]
return re

代码解读: 这段Python代码是一个函数 solution,它接受三个参数:nmax,和 array。函数的目的是在一个整数数组 array 中找到两个特定的数字,使得它们的特定组合不超过给定的最大值 max,并且这种组合的得分最高。这里的“得分”是基于数字的值和它们在数组中出现的次数。函数返回一个列表 re,包含两个数字,或者如果找不到这样的组合则返回 [0, 0]

下面是代码的详细解释:

  1. 排序数组

    • array.sort(reverse=True) 将数组 array 按从大到小的顺序排序。
  2. 处理数字1

    • num_one = array.count(1) 计算数组中数字1出现的次数。
    • while 1 in array: 循环移除数组中的所有1。
    • for i in range(num_one): 循环将移除的1重新插入数组的开头,确保1始终在数组的前面。
  3. 计数数字出现次数

    • num = {} 创建一个空字典 num 来存储每个数字及其出现次数。
    • for i in array: 循环遍历数组中的每个数字。
    • num[i] = num.get(i, 0) + 1 更新字典 num,记录每个数字的出现次数。
  4. 寻找最佳组合

    • re = [0, 0] 初始化列表 re,用于存储找到的最佳组合的两个数字。
    • print(num) 打印字典 num,用于调试。
    • for k in num: 循环遍历字典 num 的键(即数组中的不同数字)。
    • f = False 初始化标志变量 f,用于标记是否找到最佳组合。
    • if num.get(k) >= 3: 如果当前数字 k 出现至少3次,考虑它作为第一个数字。
    • for kk in num: 内层循环遍历字典 num 的键,寻找第二个数字。
    • if kk != k and num.get(kk) >= 2: 如果第二个数字 kk 与第一个数字不同且至少出现2次。
    • if 3 * re[0] + 2 * re[1] <= max: 如果当前组合的得分不超过 max
    • f = True 将标志变量 f 设置为 True
    • break 跳出内层循环。
    • if f: 如果找到了最佳组合,跳出外层循环。
    • else: 如果没有找到最佳组合,将 re 设置为 [0, 0]
  5. 返回结果

    • return re 返回列表 re,包含找到的最佳组合的两个数字,或者如果没有找到则返回 [0, 0]

这个函数的逻辑是基于给定的数组和最大值 max,寻找两个数字,使得它们的特定组合不超过 max,并且这种组合的得分最高。得分是基于数字的值和它们在数组中出现的次数,其中出现次数多的数字具有更高的优先级。