从内部闭包返回值

时间:2018-10-10 02:19:53

标签: swift

找不到用于搜索此内容的解决方案。经典问题-要查找整数数组中是否存在任何对,例如[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
}

如何退货?

2 个答案:

答案 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
    }