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

138 阅读2分钟
def solution(n, max, array):
    # Edit your code here
    count =15*[0]
    for card in array:
        if card == 1:
            card = 14
        count[card]+=1
    
    m3 = 0
    m2 = 0
    for i in range(14,1,-1):#反着走
        if count[i] >= 3:
         for j in range(14,1,-1):
            if count[j]>=2 and i!=j:
                if i == 14:
                    ix=1
                else:
                    ix=i
                if j == 14:
                    jx=1
                else:
                    jx=j
                if ix*3+jx*2<=max:
                    if i>m3 and j>m2:
                        m3=i
                        m2=j
    if m3 == 14:
        m3=1
    if m2 == 14:
        m2=1
    return[m3,m2]


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])

题目就是从2到A有13种扑克牌,A牌面最大,2牌面最小。但它们每个对应一个数字,A:1,2:2,3:3,····K:13。然后输入一堆这些牌,找五张,要求三个相同和两个相同,就是三带二。然后还有个输入max, 5张牌的牌面值加起来<max。输出最大牌面的组合。

输入: 第一行:牌数 max 第二行:各个牌的牌面值

输出: 最佳的组合[三个的,两个的]

两个概念:牌面和牌面值

这题注意的点就是A牌面值最小,是1,但它的牌面最大。也就是只有在考虑牌面值之和是否小于max这一点时候要把A考虑成1,别的时候能选A优先选A。也就是A优先级最高,牌面最大。

这题不难,但我技术太菜,想不到啥妙法。牌面值是1到13 。在满足小于max的前提下,要比较哪个牌面大,直接按数字比不好比,因为A的数字是1,最小。我想到把1换成14,这样选的时候14自然是最大的,符合A牌面最大。后面判断的时候只要按照数字大小比较就行了。这就把问题回归到数字比大小上了。小弟没找到什么方法把1换成14并且别的顺序不变,所以只能用if else了。感觉这里像循环右移。评论区大佬有没有啥妙招。

别的就没啥了。先设两个变量m3,m2。找3个相同的,紧接着找2个相同的,判断能满足小于max否。在判断是不是比已经选的m3,m2好,好就换了,不好就继续找。最后再return m3和m2。

看别的大佬用的是键值对map,感觉可以,这样不用被数组下标困住了,只要1:141对应了14,就好算了。