您已获得一副扑克牌。西装没关系。可能有重复。卡用数字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]))
请让我知道如何解决此代码。对于以上输入无效。
答案 0 :(得分:0)
您的解决方案有几个问题。我相信您正在使问题的方式变得比需要的复杂。如果我们认为正确的话,我们可以在O(N)
中解决这个问题。
1)由于我们有输入限制,因此我们不关心重复的卡,因此可以使用标志数组。如果有卡,将位置设置为True,否则将位置设置为
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)])
答案 1 :(得分:0)
我无法提供完整的解决方案,但是从我看来,如果您的数组是(10,11,12,13,1)代表(10,Jack,Queen,King,Ace),{ {1}}将1移到列表的开头,结果为array.sort()
。纠正此问题的一种方法可能是设置一个条件,如果在输入中检测到1以测试原始数组和修改后的数组,则将其替换为14,然后在测试之前对数组进行排序以说明可用于Ace。在扑克安排的两端使用。
类似的东西
False
然后继续测试if 1 in array:
ace_array = array.copy()
ace_array.sort()
ace_array.pop(0)
ace_array.append(14)
和array