Найти ближайшее меньшее число в массиве - PullRequest
1 голос
/ 06 июля 2019

Я бы хотел найти ближайшее меньшее значение в массиве чисел. Например, если у меня есть:

[1, 4, 6, 9, 14, 39]

И я ищу ближайшее значение меньше, чем:

8

Функция вернет:

6

Кроме того, если я передам число, превышающее максимальное значение в массиве, оно должно вернуть максимум. Если я пропущу число меньше минимального, оно должно вернуть ноль.

Я попытался сделать это, используя функцию first для массивов, однако это само по себе не дает желаемого результата, так как мне нужно что-то вроде этого:

numbers.first(where: { $0 <= target && $1 < target })

но, к сожалению, это недопустимо. Какие-либо предложения? Я знаю, что это можно сделать довольно просто с помощью цикла while, однако я надеялся, что будет более чистый и функциональный способ.

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Учитывая, что массив отсортирован, вам нужно

if let value = numbers.last(where: { $0 <= target }) {
  print(value)
}
1 голос
/ 06 июля 2019

Это общее решение с использованием бинарного поиска.Массив должен быть отсортирован

extension RandomAccessCollection where Element : Comparable {
    func lowerElement(of value: Element) -> Element? {
        var slice : SubSequence = self[...]

        while !slice.isEmpty {
            let middle = slice.index(slice.startIndex, offsetBy: slice.count / 2)
            if value < slice[middle] {
                slice = slice[..<middle]
            } else {
                slice = slice[index(after: middle)...]
            }
        }
        return slice.startIndex == self.startIndex ? nil : self[self.index(before: slice.startIndex)]
    }
}

let array = [1, 4, 6, 9, 14, 39]
let result = array.lowerElement(of: 8)
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...