你得到了一副牌。这套衣服不重要。可能会有重复。卡片由数字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]))
请让我知道如何修复此代码。它不适用于上述输入。你知道吗
我不能提供完整的解决方案,但是从我看到的情况来看,如果数组是(10,11,12,13,1)表示(10,Jack,Queen,King,Ace),
array.sort()
会将1移到列表的开头,从而产生一个False
结果。纠正这种情况的一种方法是,如果在输入中检测到1,则设置一个条件来测试原始数组和修改后的数组,用14替换1,然后在测试之前对数组进行排序,以说明在扑克排列的两端都可以使用Ace。你知道吗像这样的
然后继续测试
array
和ace_array
你的解决方案有几个问题。我相信你把问题弄得比实际需要的复杂多了。如果我们想得对的话,我们可以在
O(N)
内解决这个问题。你知道吗1)由于我们有有限的输入,我们不关心重复卡,我们可以使用一个标志数组。如果我们有卡,则将位置设置为True;如果没有卡,则将位置设置为false
2)由于我们需要五张连续的卡片,如果我们巧妙地使用模数并跟踪连续的卡片,我们只需要在数组中循环一次。综合起来,我们可以得出以下结论
相关问题 更多 >
编程相关推荐