识别数字列表中的算术进度

时间:2015-06-25 06:16:06

标签: python math

每个具有N个项(具有d1,d2,... dm不同的项)的M个算术进展作为输入传递,其中术语是混洗的。程序必须按顺序打印M个算术进程中的术语,并且起始项最小。

示例输入/输出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中)?

1 个答案:

答案 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)]