从内部闭包返回值



找不到搜索此解决方案的解决方案。经典问题 - 想要查找整数数组中任何对是否存在总和,使得 [1,2,3,4], 7 为真

我的天真解决方案给出了错误

无效函数中意外的非 void 返回值

我猜是因为我想从内部返回每个关闭。

func pairs (_ input: [Int], _ sum: Int ) -> Bool {
input.forEach { (number) in
let secondInput = input.filter{$0 != number}
secondInput.forEach{secondNumber in
if ((secondNumber + number) == sum) {
return true
}
}
}
return false
}

如何退货?

附言 如果您只是想让您的幼稚解决方案正常工作,请忽略。

怎么样?它考虑了时间+空间的复杂性。

我相信这应该适用于大型集合或数组

func pairs (_ input: [Int], _ sum: Int ) -> Bool {
var firstIndex = 0
var lastIndex = input.count - 1
while firstIndex != lastIndex {
let sumCalculated = input[firstIndex] + input[lastIndex]
if sumCalculated == sum {
return true
} else if sumCalculated > sum {
lastIndex = lastIndex - 1
}  else if sumCalculated < sum {
firstIndex = firstIndex + 1
}
}
return false
}

>forEach只遍历给定的序列,你不能从forEach闭包返回值。contains更适合此类任务:

func pairs(_ input: [Int], _ sum: Int ) -> Bool {
return input.contains { number in
let secondInput = input.filter { $0 != number }
return secondInput.contains { secondNumber in
return secondNumber + number == sum
}
}
}

您还可以尝试一个功能更强大的解决方案,将问题分为多个步骤:

func pairs(_ input: [Int], _ sum: Int ) -> Bool {
return input            
.flatMap { input1 in input.map { input2 in (input1, input2) } } // build all combinations of numbers from the input array
.contains { input1, input2 in input1 != input2 && input1 + input2 == sum } // check if a pair made of two distinct numbers adds up to the sum
}

如果您需要一个处理任何类型的输入(例如仅唯一数字(的解决方案,那么功能解决方案可以适应这一点:

func pairs(_ input: [Int], _ sum: Int ) -> Bool {
return input.indices
.flatMap { i1 in input.indices.map { i2 in (i1, i2) } }
.contains { i1, i2 in i1 != i2 && input[i1] + input[i2] == sum }
}

最新更新