豆包ai初体验 | 豆包MarsCode AI 刷题

124 阅读4分钟

在这里简单分享一下利用豆包ai生成代码注释的功能。

在每一个"""内的文本都是我将代码发送给豆包并且让豆包生成注释和样例,然后我将豆包生成的话语以自己的形式书写在注释栏内。比如第一个Counter对象,在我接触青训营之前从来没有看过python相关的文章,函数更是不了解,豆包能给我解释这样的函数,弥补缺陷。

说完了功能,下面就是我对寻找最大葫芦这个题目的所思所想,全部以注释的形式展现。可能会帮助到大家,如果有啥解释不到位的请及时在评论区提出建议,感谢大家利用宝贵时间观看这些浅谈!

题目:

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

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

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

def solution(n, max_value, array) :
    from collections import Counter
    count = Counter(array)
    """
    Counter对象 记录了每种牌面值的出现次数
    """
    sorted_values = sorted(count.keys(), reverse=True)
    """
    sorted_values 对牌面值进行排序,方便找到最大的组合
    count.keys() 返回包含所有牌面值的列表
    sorted() 内置排序函数
    reverse=True 参数由大到小排列
    """
    max_a, max_b = 0, 0
    """
    初始化 a, b 最大组合的值
    """
    for a in sorted_values:
        """
        ∵a的数量必须有3张 且 a的数量超过3张也不会影响比较
        ∴a>=3 
        """
        if count[a] >= 3:
            # 遍历所有可能的牌面值 b
            for b in sorted_values:
                """
                “另外两张相同牌面值的牌b”告诉我们a和b的值不一样
                ∴引进b时要判断a=b是否成立
                ∵b的数量必须有2张 且 b的数量超过2张也不会影响比较
                ∴b>=2 
                注:其中包括三张相同牌面值的牌a 和另外两张相同牌面值的牌b 用完了
                """
                if b != a and count[b] >= 2:
                    # 计算当前组合的和
                    current_sum = 3 * a + 2 * b
                    # 检查是否符合条件
                    """
                    “组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max”
                    """
                    if current_sum <= max_value:
                        # 判断a,b是否为1
                        if a == 1:
                            max_a = a
                        if b == 1:
                            max_b = b
                        """
                        ∵1的面值>2~13所有的面值
                        ∴当1出现时 其他所有数字都要失效 即1成为最大值
                        ∵首先识别a的最大值
                        ∴先判断a是否为上限1 并且如果a不是上限1 max_a不会改变
                        ∵牌a相同再比较b的大小
                        ∴判断b是否为上限1 并且b不是上限1时max_b不会改变
                        """
                        # 这个条件的问题在于max_a和max_b都是存储当前找到的最大葫芦组合的三张or两章牌面值
                        # 并非存储a或b在所有组合中的最大值
                        # if (a != 1 and max_a == 1) and (b != 1 and max_b == 1) :
                        #     a, b = 1, 1
                        """
                        ∵ a 的优先级比 b 高 即使 b 为 1
                        ∴首先满足 a > max_a
                        ∵规则中 1 最大 且 a = 1 已判断
                        ∴ a != 1 
                        ∴ a 满足第一个条件时 max_a, max_b 改变
                        ∵ a 相同(即 a == max_a)再比较 b 的大小 
                        同理可得(b > max_b 且 b != 1)
                        ∴ b 满足条件时 a 与 max_a 等量代换 max_b 改变
                        考虑到 a < max_a 但 b = 1 的情况 这里交换范围为 a >= max_a 排除了 a < max_a 的可能 也排除了这种情况
                        """
                        # 更新最大组合
                        if (a > max_a and a != 1) or (a == max_a and b > max_b and b != 1):
                            max_a, max_b = a, b

    # 如果没有找到符合条件的组合,返回 [0, 0]
    if max_a == 0 and max_b == 0:
        return [0, 0]
    
    return [max_a, max_b]