获取阵列中每对唯一对的总和

时间:2018-04-30 22:12:51

标签: python

我正在做这个数组对总和问题,它说: 给定整数数组,输出总和为特定值k的所有唯一对。

所以输入:

pair_sum([1,3,2,2],4)

将返回2对:

(1,3)
(2,2)

似乎是一个非常简单的问题。这就是我的脚本:

def pair_sum(arr,k):
    count =0
    l = []
    y = []
    for i in range(len(arr)-1):
            l.append((arr[i], arr[i+1]))
            y.append((arr[i-1],arr[i]))
    res = list(set(y+l))
    for i,j in res:
        if i + j == k:
            print (i,j)
            count +=1
    return count

除了这个测试用例之外,我工作得很好: pair_sum([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10)

我的代码返回5但它应该返回6.我知道这可以手动计算,然后我可以检查哪一对丢失但是如果测试用例足够大会怎样。我无法手动检查每个案例。

任何人都可以告诉我在这里做错了什么,因为我可能已经考虑了几乎所有可能的对。另外,就像我不想在这里使用set一样,可以有更通用的解决方案,而不是任何语言。因为如何在不使用set的情况下获得唯一对?

4 个答案:

答案 0 :(得分:0)

我无法保证效率,但是:

[(x,y) 
 for (i,x) in enumerate(arr) 
 for (j,y) in enumerate(arr) 
 if i < j and x+y == k]

只需遍历所有对,只保留第一个元素在第二个元素之前的那些对,以避免重复。

答案 1 :(得分:0)

我所做的是将元素添加到集合中,并将总和与列表元素区分开来。如果差异在我的集合中,那么我将它们配对

def pair_sum(arr,k):
count = 0
seen  = set()
output = set()
for i in arr:
    num = k - i
    if num not in seen:
        seen.add(i)
    else:
         output.add( (num,i) )
return len(output)            

答案 2 :(得分:0)

您可以使用itertools documentation中显示的pairwise()配方执行此操作,如下所示。

import itertools

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

def pair_sum(arr, k):
    for pair in (pair for pair in pairwise(arr) if sum(pair) == k):
        print(pair)

pair_sum([1, 3, 2, 2], 4)
print()
pair_sum([1, 2, 3, 1], 3)

输出:

(1, 3)
(2, 2)

(1, 2)

答案 3 :(得分:0)

def aps(arr, k):
    if len(arr)<2:
        return False

    seen = set()
    output = set()
    for num in arr:
        target = k - num
        if target not in seen:
            seen.add(num)
        else:
            output.add((min(num,target), max(num,target)))
    print(output)
    print(seen)
    return len(output)