查找数组中最近的较小数字

时间:2019-07-06 17:12:31

标签: swift

我希望能够在数字数组中找到最接近的较小值。例如,如果我有:

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

我正在寻找小于以下值的最接近值:

8

该函数将返回:

6

此外,如果我传递的数字大于数组中的最大值,则它应返回最大值。如果我传递的数字小于最小值,则应返回nil。

我尝试在数组上使用first函数来执行此操作,但是这并不会产生我想要的结果,因为我需要这样的东西:

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

但不幸的是,这是无效的。有什么建议么?我知道可以使用while循环相当简单地完成此操作,但是我希望会有一种更干净,更实用的方法。

2 个答案:

答案 0 :(得分:2)

鉴于该数组已排序,您需要

if let value = numbers.last(where: { $0 <= target }) {
  print(value)
}

答案 1 :(得分:1)

这是使用二进制搜索的通用解决方案。数组必须排序

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)