【发布时间】:2017-09-10 22:37:49
【问题描述】:
我的自学任务是找出列表中有多少个序列。序列是一组数字,其中每个数字都比前一个数字大 1。所以,在列表中:
[1,2,3,5,8,10,12,13,14,15,17,19,21,23,24,25,26]
有3个序列:
1,2,312,13,14,1523,24,25,26
我花了几个小时得到了一个解决方案,我认为这是一种解决方法,而不是真正的解决方案。
我的解决方案是有一个单独的列表来添加序列并计算更新此列表的尝试。我计算了第一个附加,以及除了已经存在的序列之外的每个新附加。
我相信有一个无需额外列表的解决方案,它允许对序列本身进行计数,而不是对列表操作尝试进行计数。
numbers = [1,2,3,5,8,10,12,13,14,15,17,19,21,23,24,25,26]
goods = []
count = 0
for i in range(len(numbers)-1):
if numbers[i] + 1 == numbers[i+1]:
if goods == []:
goods.append(numbers[i])
count = count + 1
elif numbers[i] != goods[-1]:
goods.append(numbers[i])
count = count + 1
if numbers[i+1] != goods[-1]:
goods.append(numbers[i+1])
我的调试输出:
Number 1 added to: [1]
First count change: 1
Number 12 added to: [1, 2, 3, 12]
Normal count change: 2
Number 23 added to: [1, 2, 3, 12, 13, 14, 15, 23]
Normal count change: 3
【问题讨论】:
-
提示:为什么不尝试让
goods(这个变量名是什么?)包含一个列表列表。例如。对于[1,2,3,5,8,10,12,13,14,15,17,19,21,23,24,25,26]的输入,它最终将包含[[1,2,3,5], [8], [10], [12,13,14,15], 17, 19, 21, [23,24,25,26]]。从那里,您可以过滤所有大小为 1 的列表,以获取[[1,2,3,5], [12,13,14,15], [23,24,25,26]],其len是您正在寻找的3 -
感谢您的建议。我仍然不确定如何识别何时开始新列表。如果我只知道怎么做,我可能会找到完全避免“商品”清单的方法。附言当我试图计算序列中的中断时,“Goods”是一个遗留词,而不是“Bads”。
-
假设你有一个
result列表,它的元素是子列表,我们可以称之为run。您可能有一个活动运行(您当前正在处理的那个),当您注意到下一个元素不属于它时,您会终止它(例如,它不比活动运行的最后一个元素多一个)。此时,您将此运行添加到您的结果中,并将活动运行重置为一个新的空列表,并继续构建它,直到找到下一个不连续性
标签: python dynamic-programming