如何找到两个总和等于Python中目标总和的索引?

时间:2019-08-11 14:04:17

标签: python algorithm data-structures

我正在testdome.com上进行此练习以进行练习,但未通过某些测试用例。谁能帮助我指出代码中的逻辑错误?

这是我的代码的问题:

“编写一个函数,该函数在传递列表和目标和时,相对于所用时间,有效地返回任意两个数字的两个不同的,从零开始的索引,它们的总和等于目标和。 / p>

如果没有两个数字,则该函数应返回None

例如,find_two_sum([3, 1, 5, 7, 5, 9], 10)应该返回一个包含以下任何一对索引的元组:

  • 0和3(或3和0),因为3和7相加为10。
  • 1和5(或5和1),因为1和9相加为10。
  • 2和4(或4和2),因为5和5的加法是10。
def find_two_sum(numbers, target_sum):
    sss=list(dict.fromkeys(numbers))
    if (sss == None or len(sss) < 2): return None

    for item in sss:
        tesn=target_sum-item
        if tesn in sss: 
            if numbers.index(item)==numbers.index(tesn):
                continue
            else:
                return numbers.index(item),numbers.index(tesn)
    return None
print(find_two_sum([3, 1, 5, 7, 5, 9], 10))

他们有四个测试用例,我的代码只能通过前两个测试用例。

示例案例:错误的答案(由于索引0的3 +索引3的7为10,所以返回[0,2])
有和没有解决方案的不同数字:错误答案
有和没有解决方案时重复的数字:错误的答案
有大量数字的性能测试:错误答案

5 个答案:

答案 0 :(得分:0)

我相信您必须添加用于检查两个索引的区别。 例如此处:

print(find_two_sum([3, 1, 5, 7, 5, 9], 6))

该函数将给出(0, 0)的答案,尽管这是3的索引,但它本身给出了6的总和。

在这里,我添加了对不同索引的检查:

def find_two_sum(numbers, target_sum):
    sss = list(dict.fromkeys(numbers))
    if (sss == None or len(sss) < 2): return None
    tup=()
    for item in sss:
        item_index = numbers.index(item)
        tesn = target_sum - item

        if tesn in sss:
            tesn_index = numbers.index(tesn)
            if item_index!=tesn_index:
                return (item_index, tesn_index)
    return None

答案 1 :(得分:0)

我对这个问题的看法:

def find_two_sum(lst, n):
    indices = {}
    for idx, num in enumerate(lst):
        indices.setdefault(num, []).append(idx)
    for k, v in indices.items():
        i = v.pop()
        if n - k in indices and indices[n-k]:
            return i, indices[n-k].pop()

print( find_two_sum([3, 1, 5, 7, 5, 9], 6) )
print( find_two_sum([3, 1, 5, 7, 5, 9], 10) )
print( find_two_sum([1, 2, 1, 8], 10) )
print( find_two_sum([5, 5], 10) )
print( find_two_sum([11], 10) )

打印:

(1, 4)
(0, 3)
(1, 3)
(1, 0)
None

答案 2 :(得分:0)

逻辑上的一个缺陷是sss不包含原始列表中可能存在的重复项-您丢失了信息。您假设原始列表中没有重复项:list.index(n)将返回第一项的索引,其值等于n,因此您最终可以得到重复索引的结果

>>> a = [3, 1, 5, 7, 5, 9]
>>> item = 5
>>> tesn = 5
>>> a.index(item),a.index(tesn)
(2, 2)
>>> 

答案 3 :(得分:0)

您的算法存在缺陷,例如find_two_sum([5, 2], 10)给出(0, 0)。 这是因为当您选中item in sss时,如果item5时,它的值为true,则输入列表中只有一个5

答案 4 :(得分:0)

这个答案似乎是50%正确的。

def find_two_sum(numbers, target_sum):
    for n in numbers:
        for i in numbers[numbers.index(n)+1:]:
            if n+i==target_sum:
                return(numbers.index(n),numbers.index(i))
                break
    return None

print(find_two_sum([3, 1, 5, 7, 5, 9], 10))