我希望能够在数字数组中找到最接近的较小值。例如,如果我有:
[1, 4, 6, 9, 14, 39]
我正在寻找小于以下值的最接近值:
8
该函数将返回:
6
此外,如果我传递的数字大于数组中的最大值,则它应返回最大值。如果我传递的数字小于最小值,则应返回nil。
我尝试在数组上使用first
函数来执行此操作,但是这并不会产生我想要的结果,因为我需要这样的东西:
numbers.first(where: { $0 <= target && $1 < target })
但不幸的是,这是无效的。有什么建议么?我知道可以使用while循环相当简单地完成此操作,但是我希望会有一种更干净,更实用的方法。
答案 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)