如何解决在 Swift 中以前提条件获取子序列的有效方法
0,1,2,3,5,6,11,12,15,20
给定一个数字 N,我怎样才能得到一个从最后一个小于 N 的数字开始的序列?例如,如果 N = 7,我想回来
6,20
请注意,这个序列会变得非常大,并且会附加新的数字。
drop(while:)
似乎是一个不错的候选对象,但在上面的示例中,它也会删除 6
,因此我无法使用它。
解决方法
对于巨大的排序数组,最有效的方法是二分查找。它将数组切成两半,直到找到索引。
extension RandomAccessCollection where Element : Comparable {
func lastIndex(before value: Element) -> Index {
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 ? startIndex : index(before: slice.startIndex)
}
}
let array = [0,1,2,3,5,6,11,12,15,20]
let index = array.lastIndex(before: 7)
print(array[index...])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。