示例输入/输出1:
Input: 2
1 4 8 12 7 16
Output: 1 4 7 8 12 16
Explanation: There are two progressions. Hence 6/2 = 3 terms in each progression. So the first A.M has 1 4 7 and the second has 8 12 16 As 1 < 8, 1 4 7 is printed followed by 8 12 16
示例输入/输出2:
Input: 3
2 6 8 10 15 22 12 11 4
Output: 2 4 6 8 15 22 10 11 12
说明:有三个进展。因此,每个进程中9/3 = 3个术语。因此,第一个AM有2 4 6,第二个有8 15 22.第三个有10 11 12.注意:我们不能将8 10 12作为第二个进展,因为其余的数字11 15 22不用于算术级数。
我想到了一种方法,最初对数字进行排序,然后生成一个列表,其中包含每个数字与其他数字的差异。
inp=raw_input()
inputList=[int(c) for c in inp]
inputList.sort()
for i in range(0,len(inputList)):
for j in range(0,len(inputList)):
if(i!=j): #To avoid zeros
newlist.append(abs(inputList[j]-inputList[i]))
然后,将同一位置的每个数字映射到另一个列表中的数字。因此,可以识别序列。但它没有成功。有没有更好的方法来解决这个问题(最好是在Python中)?
答案 0 :(得分:0)
通过检查元素是否为算术进程,然后使用Counter dict跟踪用于处理应添加内容的元素,可以按降序排序过滤后得到列表组合:
def arith_seq(l, m):
l.sort(reverse=True)
terms = len(l) // m
combs = filter(lambda x: all((x[i + 1] - x[i] == x[1] - x[0]
for i in range(len(x) - 1))), combinations(l, terms))
out = []
from collections import Counter
cn = Counter(l)
for ele in combs:
if all(cn[c] > 0 for c in ele):
out.append(ele[::-1])
for c in ele:
cn[c] -= 1
out.sort()
return out
使用您的输入:
In [6]: inp = 3
In [7]: l = map(int,"2 6 8 10 15 22 12 11 4".split())
In [8]: arith_seq(l,inp)
Out[8]: [(2, 4, 6), (8, 15, 22), (10, 11, 12)]