Возвращаемое значение из внутреннего закрытия - PullRequest
0 голосов
/ 10 октября 2018

Не могу найти решение, ищущее это.Классическая проблема - хотите найти, существует ли сумма для какой-либо пары в массиве Integer, так что [1,2,3,4], 7 истинно

Мое наивное решение выдает ошибку

Неожиданное возвращаемое значение в 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 голосов
/ 10 октября 2018

PS Пожалуйста, не обращайте внимания, если вы только хотите, чтобы ваше наивное решение заработало.

Как насчет этого?Нужно учитывать сложность времени и пространства.

Я считаю, что это должно хорошо работать для большого набора или массивов

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
    }
0 голосов
/ 10 октября 2018

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 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...