我目前正在Leetcode中处理问题1,名为“两个和”
给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。
您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。
示例:给定nums=[2,7,11,15],target=9
,
因为nums[0]nums[1]=27=9
,所以返回[0,1]
。
我目前的代码是:
def twosum_indices(nums, target):
for i in nums:
for v in nums[i + 1:]:
if i + v == target:
return nums.index(i), nums.index(v)
在这种情况下,Nums是一个整数列表,程序必须在列表中返回两个不同的索引,这样它们的真实值加起来就是给定的目标。尽管这在大多数测试用例上运行良好,但它在像[3,3]这样两个值相同的列表中失败,并且返回两次相同的索引,比如[0,0],而不是返回[0,1]的实际答案。为什么会发生这种情况?
def twosum_indices(nums, target):
for i in range(len(nums)):
for v in range(len(nums)):
if nums[i] + nums[v] == target and i != v:
return i, v
#! /usr/bin/env python3
def two_sum_indices(nums, target):
def dup(i, j):
return i == j
d = {num: i
for i, num in enumerate(nums)}
for i, num in enumerate(nums):
if target - num in d:
if not dup(i, d[target - num]):
return i, d[target - num]
return -1, -1
if __name__ == '__main__':
print(two_sum_indices([2, 7, 11, 15], target=9))
print(two_sum_indices([3], target=6))
print(two_sum_indices([3, 3], target=6))
代码中存在多个错误,其中最重要的一个错误是未能使用enumerate
而不是list.index
。例如,[3,3]。索引(3)
当然总是0。
这个答案的重点不是找到最有效的解决方案,而是改进您的具体方法。你也可以看到O(n)解。
先决条件是,首先要了解列表中如何存在多个for
循环。
def sums(nums):
return [x + y for x in nums for y in nums[:x]]
以上相当于:
def sums(nums):
output = []
for x in nums:
for y in nums[:x]:
output.append(x + y)
return output
def twosum_indices(nums, target):
return next((i, j) for i in range(len(nums)) for j in range(len(nums[:i])) if (nums[i] + nums[j] == target))
例子:
print(sorted(twosum_indices([2, 7, 11, 15], 9)))
[0, 1]
print(sorted(twosum_indices([3, 3], 6)))
[0, 1]
这是一个稍微简单一点的迭代工具
:
import itertools
def twosum_indices_it(nums, target):
return next((i, j) for (i, x), (j, y) in itertools.combinations(enumerate(nums), 2) if (x + y == target))
例子:
print(sorted(twosum_indices_it([2, 7, 11, 15], 9)))
[0, 1]
print(sorted(twosum_indices_it([3, 3], 6)))
[0, 1]
问题内容: 今天,有人陪我一起滥用Java 中的关键字。我编写了一个简单的循环来验证数组中是否存在某些内容。假设是一个length数组,这是我的代码: 现在有人告诉我这不是一个很好的编程,因为我在循环内使用了该语句,这将导致垃圾回收发生故障。因此,更好的代码将是: 问题是我无法正确解释为什么第一个for循环不是一个好习惯。有人可以给我一个解释吗? 问题答案: 现在有人告诉我这不是一个很好的编程,因
我有一个基于Euler项目问题3的代码:“13195的素数因子是5、7、13和29。600851475143中最大的素数因子是什么?” 我在下面有一个我认为可行的代码,但第9行()不断返回错误:“索引器:列表索引超出范围”。当我在for循环中移动时,似乎并没有修改列表,所以我不确定出了什么问题。 有人知道我哪里错了吗? 非常感谢。
我有三块地 小时——分钟——和总数 如果小时或分钟发生变化,我想计算一个总数。如果总数发生变化,我想计算相应的分钟和小时数。 例子: 1h 30分钟=1.5总计 2.25总计=2h 15分钟 我正试图用手表来达到这个目的 但是,这会导致一个循环,因为on处理程序总是调用另一个处理程序。如何以更明智的方式实现这一点?
问题内容: 我在http://www.leepoint.net/notes- java/flow/loops/foreach.html上 阅读。每个等价于 是 我的问题是每个循环的空列表如何工作。我知道对于常规的for循环,arr.length只会计算为0,并且循环不会执行。每个循环的呢? 问题答案: 我的问题是每个循环的空列表如何工作 也以相同的方式工作。如果长度为零,则永远不会执行循环。 它们
问题内容: 如何在如下所示的循环中访问索引? 我想得到以下输出: 当我使用循环遍历它时,如何访问循环索引(在这种情况下为到)? 问题答案: 使用其他状态变量,例如索引变量(通常在或等语言中使用),被认为是非的。 更好的选择是使用 中都提供的内置函数:
问题内容: 假设我有一个像这样的循环: 快速提问:是否会停止循环本身的执行? 问题答案: 是的,停止执行并退出功能。always**会立即退出其功能,如果它位于for循环中,则不会进一步执行。 它很容易为您自己验证: **注意:请参阅有关的特例的其他答案,以及有关forEach循环如何具有自己的功能范围的答案,不会脱离包含函数。