gpt4 book ai didi

python - 从给定的纸牌中检测并直接返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:40:39 24 4
gpt4 key购买 nike

你得到了一副纸牌。西装无所谓。可以有重复。这些卡片由数字 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]))

请告诉我如何修复此代码。它不适用于上述输入。

最佳答案

您的解决方案存在几个问题。我相信您使问题变得比需要的更复杂。如果我们的想法正确,我们可以在 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)])

关于python - 从给定的纸牌中检测并直接返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51508170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com