找不到用于搜索此内容的解决方案。经典问题-要查找整数数组中是否存在任何对,例如[1,2,3,4],7为真
我天真的解决方案给出了错误
void函数中意外的非void返回值
我猜是因为我想从内部forEach闭包中返回。
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
}
如何退货?
答案 0 :(得分:0)
db.collection('collection_name').find(filters).toArray(function(err, items){
if(err){
console.log(err)
return res.send(500,'something went wrong')
}
else{
res.send({"ISM": items})
}
})
仅遍历给定序列,不能从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
}
答案 1 :(得分:0)
P.S如果您只是想让您的天真解决方案起作用,请忽略。
这个怎么样?它需要时间+空间复杂性。
我相信这对于大型集合或数组应该很好用
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
}