我不确定我做错了什么,但是当我执行下面的代码时:
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
let length = nums.count-1;
for index1 in 0...length {
let difference = target - nums[index1];
print(target, difference, nums[index1])
if (nums[index1] < difference) {
for index2 in index1+1...length {
if (nums[index2] == difference) {
return [index1, index2];
}
}
}
}
return [];
}
let summer = twoSum([-1,-2,-3,-4,-5], -8)
我收到以下错误:
Swift/ClosedRange.swift:347:致命错误:范围需要 lowerBound <= upperBound
有趣的是,如果我将 if 语句的条件更改为
nums[index1] <= target
,它就不会崩溃。
问题是,在你的内部 for 循环中,当
index
等于时length
,你的内部循环变成:for index2 in index1+1...length
。这相当于
for index2 in nums.count ... nums.count - 1
。正如错误所说,循环范围的开始不能大于范围的结束。解决方案:您只需更改
if (nums[index1] < difference)
为index1 + 1 <= length
在 Swift 中,范围的下限永远不能大于上限。乍一看,这似乎是一个令人讨厌的限制,但实际上它有巨大的好处。在所有使用范围的代码中,你始终可以依赖它不会被取反,这样你就不必到处都小心翼翼地检查这种情况了。
Stoic 已经给出了一个解决方案,但我建议另一个:不要创建自己的范围。
nums.indices
将准确生成您正在寻找的第一个循环边界的范围,因此它可以是for index1 in nums.indices
。.dropFirst()
。这将正确处理您尝试删除的元素数量超过范围的情况(它只会返回一个空范围)。