Code Fight findClosestPair не возвращает правильное расстояние между суммами - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь решить битвы кода и заставить все работать, кроме следующего теста:

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 (numbers, sum) = 2. 1 и 4 имеют сумму 5, но 2 и 3 ближе.для чисел = [2, 3, 7] и суммы = 8 вывод должен быть findClosestPair (числа, сумма) = -1.Не существует пар с суммой 8.

Следующая функция вернет все числа true для всех случаев, за исключением того, что последующий набор чисел ближе.В приведенном выше примере 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 голосов
/ 05 июня 2018

То, что 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)
0 голосов
/ 05 июня 2018

Попробуйте использовать itertools.permutations, затем выполните итерацию по нему и проверьте, равна ли сумма этих двух чисел sum или нет, если она добавляется в новый список l, затем выполните итерацию по l использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...