我正在做这个数组对总和问题,它说:
给定整数数组,输出总和为特定值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
的情况下获得唯一对?
答案 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)