青训营题目之寻找最大葫芦| 豆包MarsCode AI刷题

485 阅读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]

解题思路

首先此题应当先检查输入数组中有没有符合要求的牌,即一张牌a数量大于等于3,一张牌b数量大于等于2

frequency = {}
    for card in array:
        if card in frequency:
            frequency[card] += 1
        else:
            frequency[card] = 1

然后我们要做的是找到最大葫芦,即在小于设定的max之下,3a+2b和最大,相等时优先a大

x=0
y=0
for a in frequency:
    if frequency[a] >= 3:
        for b in frequency:
            if a != b and frequency[b] >= 2:
                # 计算总和
                total = 3 * a + 2 * b
                if total <= max:
                    # 比较并更新最佳结果
                    if a > x or (a == x and b > y):
                        x = a
                        y = b
# 返回结果
return [x, y]

刚做的时候代码中三个测试案例都是True,但不知道为什么测试案例4就无法通过了

image.png

当时我理解上13* 3+1* 2也没有超过42,为什么要三张1呢 然后我看了MarsCode的思路如下:

MarsCode解题思路

  1. 牌面值的映射

    • 我们需要将牌面值映射到一个数值范围,以便于比较大小。例如,A 映射为 14,K 映射为 13,Q 映射为 12,依此类推。
  2. 统计牌的出现次数

    • 使用一个字典来统计每种牌面值出现的次数。
  3. 生成所有可能的“葫芦”组合

    • 遍历字典,找到所有可能的三张相同牌面值的组合。
    • 对于每个三张相同牌面值的组合,再找到所有可能的两张相同牌面值的组合。
  4. 筛选符合条件的“葫芦”组合

    • 计算每个“葫芦”组合的牌面值之和,筛选出不超过 max 的组合。
    • 在符合条件的组合中,找到牌面值最大的组合。

我发现思路上并没有问题,但AI提供了一个映射的思路。我后续重新看题目才发现设定上A是最大的,所以重新设置了判断条件,变为if-elif-else对三张A和两张A重新考虑, 更新后代码如下:

def solution(n, max, array):
    frequency = {}
    frequency[1]=0
    for card in array:
        if card in frequency:
            frequency[card] += 1
        else:
            frequency[card] = 1
    x=0
    y=0
    if frequency[1] >= 3:
        for b in frequency:
            if b != 1 and frequency[b] >= 2:
                # 计算总和
                total = 3+ 2 * b
                if total <= max:
                    # 比较并更新最佳结果
                    if b > y:
                        x = 1
                        y = b
        return [x, y]
    elif frequency[1] == 2:
        for a in frequency:
            if a != 1 and frequency[a] >= 3:
                # 计算总和
                total = 3*a+ 2 
                if total <= max:
                    # 比较并更新最佳结果
                    if a > x:
                        x = a
                        y = 1
        return [x, y]    
    else:
        for a in frequency:
            if frequency[a] >= 3:
                for b in frequency:
                    if a != b and frequency[b] >= 2:
                        # 计算总和
                        total = 3 * a + 2 * b
                        if total <= max:
                            # 比较并更新最佳结果

                            if a > x or (a == x and b > y):
                                x = a
                                y = b
        return [x, y]

if __name__ == "__main__":
    # Add your test cases here

    print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5])
    print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9])
    print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0])

将等于1的情况重新考虑,测试案例就无误了