我正在testdome.com上进行此练习以进行练习,但未通过某些测试用例。谁能帮助我指出代码中的逻辑错误?
这是我的代码的问题:
“编写一个函数,该函数在传递列表和目标和时,相对于所用时间,有效地返回任意两个数字的两个不同的,从零开始的索引,它们的总和等于目标和。 / p>
如果没有两个数字,则该函数应返回None
。
例如,find_two_sum([3, 1, 5, 7, 5, 9], 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])
有和没有解决方案的不同数字:错误答案
有和没有解决方案时重复的数字:错误的答案
有大量数字的性能测试:错误答案
答案 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
时,如果item
为5
时,它的值为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))