Суммирование двух int в списке python

Таким образом, я являюсь Python noobie, и я решил, что хороший способ изучить язык – это решить некоторые проблемы с использованием leetcode.

Первая проблема: «Учитывая массив целых чисел, возвращайте индексы двух чисел так, чтобы они соответствовали определенной цели». Я закодировал решение довольно быстро в java, но когда я попытался реализовать его в Python, значения, которые я возвращаю, оставляют меня царапающей мою голову. Учитывая вход [3, 2, 4] и цель 6, он должен вернуться назад [1, 2], но в настоящее время он возвращает [0, 1]

Python:

class Solution(): def twoSum(self, nums, target): for i, num1 in enumerate(nums): for j, num2 in enumerate(nums, i + 1): if (num1 + num2 == target): return [i, j] 

Ява:

 class Solution { public static int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { int sum = nums[i]; for (int j = i + 1; j < nums.length; j++) { if (sum + nums[j] == target) { return new int[] {i, j}; } } } return null; } } 

Любые идеи о том, почему я возвращаю этот результат?

Необязательный второй аргумент для enumerate не делает то, что вы думаете, что он делает. Похоже, ваше намерение состояло в том, чтобы использовать это как отправную точку в списке. Но то, что он на самом деле делает, это использовать его как отправную точку для нумерации элементов списка, т. Е. Это значение, связанное с первым элементом списка. Например:

 >>> list(enumerate(["a", "b", "c"], 5)) [(5, 'a'), (6, 'b'), (7, 'c')] >>> 

Таким образом, в вашем случае внешний цикл нумерует элементы 0, 1 и 2. Внутренний цикл выполняет итерацию по всем трем элементам, но нумерует их 1, 2, 3. Первая итерация каждого цикла извлекает значение 3 из списка и 3 + 3 совпадения, с num1 – 0, а num2 – 1.

Второй аргумент enumerate() в Python не делает то, что вы думаете, что он делает. Вместо того, чтобы влиять на тот элемент списка, который он начинает, он просто влияет на индекс, который он возвращает.

Что вы должны делать: for j, num2 in enumerate(nums[i + 1:], i + 1):

Что он делает, так это то, что он использует нарезку Python для удаления первых элементов i из списка, а затем корректирует индекс во втором аргументе enumerate() для получения правильного вывода.

Вы можете использовать диапазон, основанный на цикле, для этого, как и в Java.

 def twoSum(self, nums, target): for i in range(len(nums)): sum = nums[i] for j in range(i+1, len(nums)): if (sum + nums[j] == target): return [i, j] 

Вместо этого используйте диапазон, основанный на цикле:

 class Solution(): def twoSum(self, nums, target): for i in range(len(nums)): for j in range(i+1, len(nums)): if (nums[i] + nums[j] == target): return [i, j] 

Здесь вы можете найти рабочий пример:

 class Solution(): def twoSum(self, nums, target): for i, num1 in enumerate(nums): for j, num2 in enumerate(nums): if (j>i and (num1 + num2) == target): return [i, j] return "Not found" print(Solution().twoSum([1,2,3,4,5,6,7,8], 10)) # [1, 7] print(Solution().twoSum([1,2,3,4,5,6,7,8], 22)) # Not found print(Solution().twoSum([8,7,6,5,4,3,2,1], 10)) # [0, 6] print(Solution().twoSum([8,7,6,5,4,3,2,1], 22)) # Not found 

Ваша ошибка заключалась в том, что, как вы можете прочитать из документации, вы неверно истолковали второй параметр в функции enumerate . Фактически это делается, чтобы установить начальную точку для счетчика. Если мы не установим, что он начнется с 0 abd, это будет равно индексу.