如何将一个列表中的两个数字相加?

时间:2018-04-10 19:50:54

标签: python python-3.x

python 3的解决方案是什么?

****给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。 您可以假设每个输入都只有一个解决方案,并且您可能不会使用相同的元素两次。``

Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]. 

7 个答案:

答案 0 :(得分:1)

使用outermost(//div)将列表中的元素组合成非重复的夫妻,并检查总和是否匹配。如果是,请打印条款的位置:

itertools.combinations

答案 1 :(得分:0)

此函数遍历列表中的所有数字,并查找与其他数字的总和。如果总和等于目标,则返回索引

def indices_sum(nums,target):
    for i in range(len(nums)):
        for j in range(i+1,len(nums)):
            if nums[i]+nums[j] == target: return(i,j)

答案 2 :(得分:0)

这个问题有两个部分:

  1. 检索列表中与目标相等的2个项目
  2. 检索其索引值

    def get_index_for_target(nums,target):

    for x in nums:
        for y in nums:
            if x + y == target:
                return (nums.index(x), nums.index(y))
    

答案 3 :(得分:0)

测试所有可能的耦合(使用叠加循环或itertools.combinations)的解决方案的主要问题是O(n ^ 2),因为您基本上测试了n中两个元素的所有可能组合(有n个) *(n-1)/ 2个此类组合),直到找到有效的。

当n很大时,您需要一个更有效的算法。一种可能性是首先对列表进行排序(这是O(n * log(n))),找到解决方案然后可以直接在O(n)中完成,这为O(n * log(n)提供了解决方案)。

我们首先对列表进行排序,然后添加第一个(最小)和最后(最大)值。如果总和太大,我们可以删除最大值。如果它太小,我们会移除最小的一个,直到达到确切的总和。

我们可以使用collection.deque有效删除列表任意一端的值。

为了检索索引,我们将它们保留在元组中的值之外。

from collections import deque


def find_target(values, target):

    dq = deque(sorted([(val, idx) for idx, val in enumerate(values)]))

    while True:
        if len(dq) < 2:
            raise ValueError('No match found')

        s =  dq[0][0] + dq[-1][0]

        if s > target:
            dq.pop()
        elif s < target:
            dq.popleft()  
        else:
            break
    return dq[0], dq[-1]



values = [23, 5, 55, 11, 2, 12, 26, 16]
target = 27

sol = find_target(values, target)

print(sol)
# ((11, 3), (16, 7))
# 11 + 16 == 27, indices 3 and 7

print(sol[0][1], sol[1][1])
# 3 7

答案 4 :(得分:0)

对于列表中的每个条目,检查列表中是否有任何其他数字加到目标之后。由于a + b = target相当于b = target-a,你可以只取每个元素,查看该元素之后的所有数字,并检查它们是否是target - element。如果是,请返回索引。

for index,num in  enumerate(nums):
    if target-num in nums[index+1:]:
        return(index, nums.index(target-num))

答案 5 :(得分:0)

我们可以在列表的开头和结尾处使用指针,通过两个数字的和检查每个索引,循环一次。

def sumOfTwo(array, target):
    i = 0
    j = len(array) - 1
    while i < j:
      add = array[i] + array[j]
      if add == target:
        return True
      elif add < target:
        i += 1
      else:
        j -= 1
    return False 

input -> [1, 2, 3, 4] -> target: 6

 i->    <-j
[1][2][3][4]  if i + j = target return True 
              if i + j < target increase i
              else decrease j

注意: :在极少数情况下,循环前需要进行检查,以防万一:target为负值,列表为空,target为空。 / p>

答案 6 :(得分:0)

我们可以执行以下操作:

numbers = [2, 7, 11, 15]
target =9
for x in numbers:
    for y in numbers:
        if x+y==target:
            print(x,y)