首页 > 解决方案 > 直接从给定的纸牌中检测并返回

问题描述

你得到了一副纸牌。西装无所谓。可以有重复。卡片由数字 1 到 13 表示。

目标是在给定列表中找到所有可能的直线。顺子被定义为 5 张连续的牌:1, 2, 3, 4, 5是顺子和10, 11, 12, 13, 1&5,6,7,8,9,10不是。我为此编写了代码,但我的代码并非在所有情况下都有效:

def is_straight(array):
    n = len(array)

    if n % 5 != 0:
        return False

    array.sort()
    prev = array[0]
    if n == 5:
        output = []
        i = 1
        while i < n:
            if array[i] - prev == 1:
                output.append(array[i - 1])
                prev = array[i]
                i += 1
            else:
                return False
        output.append(prev)
        return output

    else:
        l = int(n / 5)
        st_list = [[] for i in range(l)]
        set_track = 0
        for i in range(1, n):
            if array[i] - prev == 1:
                for k in range(0, len(st_list)):
                    if prev not in st_list[k]:
                        st_list[k].append(array[i-1])
                        set_track = k
                        break
            elif array[i] - prev == 0:
                for k in range(0, len(st_list)):
                    if prev not in st_list[k]:
                        st_list[k].append(array[i-1])
                        set_track = k
                        break
            elif array[i] - prev > 1:
                del st_list[set_track]
                l -= 1
            prev = array[i]
        st_list[l-1].add(prev)
        return st_list


print(is_straight([1,2,3,4,4,6,7,8,9,10, 1,2,3,4,4,6,7,8,9,10]))

请让我知道如何修复此代码。它不适用于上述输入。

标签: pythonpython-3.xalgorithm

解决方案


您的解决方案存在几个问题。我相信你让问题变得比它需要的更复杂。O(N)如果我们以正确的方式思考,我们可以解决这个问题。

1)由于我们有有限的输入并且我们不关心重复的卡片,我们可以使用一个标志数组。如果我们有卡,则将位置设置为 True,如果没有,则设置为 false

2)由于我们需要五张连续的卡片,如果我们巧妙地使用模数并跟踪连续的卡片,我们只需要遍历数组一次。把它们放在一起,我们可以得到以下

def sol(myHand):
    hand = [False for _ in range(13)]
    for card in myHand:
        hand[card-1] = True 

    for i in range(len(hand)):
        staightCounter = 0
        while hand[i % 13] and staightCounter < 5:
            i += 1
            staightCounter += 1
        if staightCounter >= 5:
            print([ x % 13 + 1 for x in range(i-5,i)])

推荐阅读