假设我有以下列表x = [1,2,3,3,2,0]
,并且我想计算单调项的数量(增加,减少和恒定)。因此,在我的示例中:
1. Increasing: [1,2], [2,3], [1,2,3]
2. Constant: [3,3]
3. Decreasing: [3,2], [2,0], [3,2,0]
总共7个项目。
先谢谢您。
答案 0 :(得分:1)
由于您未显示任何代码,因此我只会给您一些提示。主要思想是从第二个项目(索引1
)开始,逐步执行序列,并更新每个项目的信息,计算在该项目结束的单调序列的数量。
在浏览列表时,请存储几条信息。首先,您需要针对三种单调序列的计数器。无需分别计算序列的种类:您可以在一个计数器中将它们全部一起计数。您需要三向或四向信号来记录前一个单调序列的序列类型(递增,恒定或递减),并且需要一个整数来显示前一个单调序列的长度。使用该信息,您可以使用适当的数量更新适当的计数器。请注意,在存在任何种类的单调序列之前,您需要谨慎处理列表的开头。
现在从第二项(索引1
)开始逐步浏览输入列表。将当前项目与上一个项目进行比较。更新当前单调序列的长度:如果最后两个项目的方向与先前的方向一致,则您的单调序列已经变大了一个项目;否则,您将拥有一个长度最小的新单调序列。现在,通过增加新的单调序列的数量来增加总体计数器。如果新序列的长度为2(先前项和当前项),则添加1;如果新序列的长度为3,则添加2,依此类推。
处理这些提示。如果您需要更多帮助,请显示更多工作并解释您遇到的困难,然后寻求更多帮助。但是您需要付出更多的努力。我已经按照这些提示编写了代码,它很好,有效且简短。编码愉快!
根据另一个回答者的看法,他认为您已经完成了足够的工作,这是我的代码。 (为了完整起见,我显示此代码-请不要从另一个答案中删除您的“接受”。)我包括两个可以轻易插入到主例程中的小函数,但是这些函数本身是有用的。
def pairwise(seq):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
if seq:
return zip(seq, seq[1:])
else:
return zip()
def cmp(x, y):
"""Return an integer depending on the comparison of two values.
Return -1 if x < y,
0 if x == y,
1 if x > y.
"""
return (x > y) - (y > x) # a common Python trick: bool values to int
def count_monotonic_subsequences(seq):
"""Return the number of monotonic (consecutive) subsequences of
length at least 2 in a sequence."""
run_length = 0
prev_cmp = None # no comparisons done yet
count_so_far = 0
# For each item, add how many monotonic sequences end with that item
for prev_item, item in pairwise(seq):
this_cmp = cmp(prev_item, item)
if this_cmp == prev_cmp:
run_length += 1 # this item extends the previous mono subsequence
else:
run_length = 1 # this item begins a new monotonic subsequence
prev_cmp = this_cmp
count_so_far += run_length # add new mono subsequences ending here
return count_so_far
print(count_monotonic_subsequences([1,2,3,3,2,0])) # 7
答案 1 :(得分:-1)
通过将问题分解为更小的步骤来解决此问题要容易得多。首先,通过跟踪先前值和当前值,将项目按趋势进行分组(递增,相等或递减)。
收集所有结果,然后根据需要将结果分成较小的列表,以在第二步中获得所需的输出。
我鼓励您遵循代码中的注释并尝试自己执行这些步骤。
REQUEST_INSTALL_PACKAGE