【问题标题】:Given an array find element pairs whose sum is equal to the given sum and return the sum of their indices给定一个数组,找到总和等于给定总和的元素对,并返回它们的索引总和
【发布时间】:2019-09-16 04:56:39
【问题描述】:

大家好,正如您在问题中所读到的,我正在尝试在数组中找到等于给定总和的元素对并返回它们各自索引的总和。

我能够返回给定总和的元素对,但未能返回它们索引的总和。这是我的代码:

arr = [1, 4, 2, 3, 0 , 5]
sum = 7

x = min(arr)
y = max(arr)

while x < y:
    if x + y > sum:
        y -= 1
    elif x + y < sum:
        x += 1
    else:
        print("(", x, y, ")")
        x += 1

我的输出:

( 2 5 )    
( 3 4 )

这是我需要进一步做的:

2 + 5 = 7 → 指数 2 + 5 = 7;

3 + 4 = 7 → 指数 3 + 1 = 4;

7 + 4 = 11 → 返回 11;

提前致谢!

【问题讨论】:

  • 不确定为什么要返回 7 + 4 = 11。总和不是7吗?
  • 我正在尝试添加元素对索引的总和。 (2,5)--> 指数之和 = 7 和 (3,4)--> 指数之和 = 4 .....然后添加累积指数 7 + 4 = 11
  • 从问题中,我看到您正在尝试添加元素对的indices,其sum 等于您指定的某个数字,比如7,对吧?
  • 是的,没错。
  • 是的,这就是为什么我要问为什么问题中提到了7 + 4 = 11 --&gt; Returns 11

标签: python algorithm pairwise


【解决方案1】:

您可以尝试使用嵌套循环:

arr = [1, 4, 2, 3, 0 , 5]
sums = 7
tlist = []
for i in range(len(arr)):
    for j in range(len(arr)-1):
        if (i!=j) and ((arr[i] + arr[j+1]) == sums):
            if (i,j+1) not in tlist and (j+1,i) not in tlist:
                tlist.append((i,j+1))
                print("index ->",i,"   ",j+1)
                print("sum=", i+j+1)

输出:

index -> 1     3
sum= 4
index -> 2     5
sum= 7

【讨论】:

    【解决方案2】:

    您可以使用itertools 轻松检查sum 中的combinations 之类的,

    >>> import itertools
    >>> num = 7
    >>> for a,b in itertools.combinations(arr, 2):
    ...   if a + b == num:
            aindex, bindex = arr.index(a), arr.index(b)
    ...     indices_sum = aindex + bindex
    ...     print('[element sum]: {} + {} = {} [indices sum]: {} + {} = {}'.format(a, b, a + b, aindex, bindex , indices_sum))
    ... 
    [element sum]: 4 + 3 = 7 [indices sum]: 1 + 3 = 4
    [element sum]: 2 + 5 = 7 [indices sum]: 2 + 5 = 7
    >>> arr
    [1, 4, 2, 3, 0, 5]
    

    【讨论】:

      【解决方案3】:

      您可以通过计算差异然后检查每个元素是否存在于第一个数组中来采取不同的方法。

      arr = [1, 4, 2, 3, 0, 5]
      the_sum = 7
      
      diff = [the_sum - x for x in arr]
      for idx, elem in enumerate(diff):
          try:
              index = arr.index(elem)
              sum_of_indices = idx + index
              print("{} + {} = {}".format(idx, index, sum_of_indices))
          except ValueError:
              pass
      

      输出

      1 + 3 = 4
      2 + 5 = 7
      3 + 1 = 4
      5 + 2 = 7
      

      要删除重复项,获取索引元组的frozenset 总是很容易

      a = [(2,1), (1,2), (3,2), (2,3)]
      {frozenset(x) for x in a} # {frozenset({2, 3}), frozenset({1, 2})}
      

      【讨论】:

      • 1,3 和 3 ,1 也一样 5,2 和 2,5
      • 方案可根据需要修改。如果数字不重复,取一组总和就足够了。
      猜你喜欢
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      相关资源
      最近更新 更多