Não tenho certeza do que estou fazendo errado, mas quando executo o código abaixo:
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)
Recebo o seguinte erro:
Swift/ClosedRange.swift:347: Erro fatal: O intervalo requer lowerBound <= upperBound
Curiosamente, se eu alterar a condição da instrução if para
nums[index1] <= target
, ela não trava.
O problema é que no seu for-loop interno, quando
index
é igual alength
, seu loop interno se torna:for index2 in index1+1...length
.Isso é equivalente a
for index2 in nums.count ... nums.count - 1
. Como diz o erro, o início de um intervalo de loop não pode ser maior que o fim do intervalo.Solução: Você pode simplesmente mudar
if (nums[index1] < difference)
paraindex1 + 1 <= length
Em Swift, o limite inferior de um intervalo nunca pode ser maior que o limite superior. Isso pode parecer uma restrição irritante à primeira vista, mas na verdade traz enormes benefícios. Em todo o seu código em que você consome um intervalo, você sempre pode confiar que ele não será invertido, então não precisa verificar defensivamente essa condição em todos os lugares.
Stoic já deu uma solução, mas vou sugerir outra: simplesmente não crie seus próprios intervalos.
nums.indices
produzirá exatamente o intervalo que você está procurando para seu primeiro limite de loop, então pode ser apenasfor index1 in nums.indices
..dropFirst()
. Isso lidará corretamente com os casos em que você tenta remover mais elementos do que o intervalo (apenas retornará um intervalo vazio).