Code Fight findClosestPair没有返回sum之间的正确距离

时间:2018-06-05 01:18:18

标签: python for-loop if-statement

我试图解决代码争夺问题并让所有工作都有效,除了以下测试用例:

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)

2 个答案:

答案 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)