所以我是一个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;
}
}
关于我为何得到这个结果的任何想法?
答案 0 :(得分:2)
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。
答案 1 :(得分:1)
Python中enumerate()
的第二个参数并没有按照您的想法行事。它不会影响它开始的列表中的哪个元素,而只会影响它返回的索引。
您应该做的是:for j, num2 in enumerate(nums[i + 1:], i + 1):
这样做是因为它使用Python的切片从列表中删除第一个i
元素,然后在enumerate()
的第二个参数中调整索引以产生正确的输出。
答案 2 :(得分:1)
您可以像使用Java一样使用基于范围的for循环来执行此操作。
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]
答案 3 :(得分:0)
使用基于范围的循环代替:
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]
答案 4 :(得分:0)
您可以在这里找到一个有效的例子:
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
您的错误在于,您可以从文档here中读到错误解释enumerate
函数中的第二个参数。它实际上做的是设置一个计数器的起点。如果我们没有设置任何东西,它将从0 abd开始,这将等于索引。