我试图解决代码争夺问题并让所有工作都有效,除了以下测试用例:
Input:
numbers: [1, 0, 2, 4, 3, 0]
sum: 5
Output:
Run the code to see output
Expected Output:
2
Console Output:
Empty
代码争夺的目标是: 给定一个整数数组,我们希望找到最接近和的元素对。返回最近对之间的距离(两个索引之间的绝对差值)。如果没有一对加起来总和,则返回-1。 例 对于数字= [1,0,2,4,3,0]和sum = 5,输出应为findClosestPair(数字,和)= 2. 1和4的总和为5,但2和3更接近。 对于数字= [2,3,7]和sum = 8,输出应为findClosestPair(数字,和)= -1。没有总和为8的对。
以下函数将返回所有数字的所有数字为真,除非后续数字组更接近。在上面的示例中,2和3更接近,应该返回2的距离,但我的代码选择1和4并停止并返回它。如何修复它以添加if语句以允许返回较小的距离?
def findClosestPair(numbers, sum):
num_len = len(numbers)
distance = 10
for x in range(num_len):
for y in range(x+1,num_len):
if numbers[x] + numbers[y] == sum:
if distance > abs(y-x):
distance = abs(y-x)
else:
continue
return distance
else:
return int(-1)
此代码运行但需要很长时间才能运行。
def findClosestPair(numbers, sum):
num_len = len(numbers)
distance = 10
for x in range(num_len):
for y in range(x+1,num_len):
if numbers[x] + numbers[y] == sum:
if distance > abs(y-x):
distance = abs(y-x)
if distance != 10:
return distance
else:
return int(-1)
答案 0 :(得分:0)
尝试使用itertools.permutations
然后通过它迭代并检查这两个数字的总和是否为sum
,如果它将其附加到新列表l
然后迭代到l
1}}使用abs
并在参数中减去两个数字,然后将其附加到newl
,然后在newl
中获得最小值对中的最小值:
import itertools
def findClosestPair(numbers, sum):
l = []
newl = []
for x,y in list(itertools.permutations(numbers,2)):
if x+y == sum:
l.append((x,y))
for x,y in l:
newl.append(abs(int(x-y)))
if l:
return min([min(i) for i in l if abs(int(i[0]-i[-1])) == min(newl)])
else:
return -1
print(findClosestPair([1,2],5))
输出:
-1
答案 1 :(得分:0)
return distance
错位,当您发现任何条目低于当前最小距离时,您将返回部分结果。
更正任何长度的数组的代码,与第二个代码段非常相似:
#!/usr/bin/python3
def findClosestPair(numbers, sum):
num_len = len(numbers)
distance = num_len + 1
for x in range(num_len):
for y in range(x+1,num_len):
if numbers[x] + numbers[y] == sum:
if distance > abs(y-x):
distance = abs(y-x)
if distance > num_len:
return int(-1)
else:
return distance
n = [ 1, 0, 2 , 4 ,3, 0]
x = findClosestPair(n,5)
print(x)
只有在distance == 1
时,你才可以在循环内提早返回,因为你知道你将无法找到比这更近的任何一对。
更快的方法是逐步检查每个距离,这样您就可以在找到匹配的总和时立即返回:
def findClosestPair2(numbers, sum):
num_len = len(numbers)
for distance in range(1,num_len-1):
for x in range(0,num_len-distance):
if numbers[x] + numbers[x+distance] == sum:
return distance
return int(-1)