我不得不使用类似的东西
arr = [10, 20, 50, 80, 110]
(arr.bsearch_index{|a| a >= 50} || arr.length) - 1 # => 1
(arr.bsearch_index{|a| a >= 2000} || arr.length) - 1 # => 4
返回值-1
意味着没有这样的索引。如果数字可以是浮动的怎么办,所以你不能寻找49
when n
is 50
。现在的代码有点乱。有没有更优雅的方法来做到这一点?
(也许这就是bsearch_index()
它的方式:nil
在找不到时返回......所以我们只需要使用bsearch(){ } || arr.length
将其转换回严格的数字 - 这就是它的方式。bsearch_index
要么只返回数字,要么它可以返回nil
作为设计决策,它选择了返回nil
。但我不确定我们是否只需要使用上面的代码。也许find-any
模式bsearch_index
或某种方式可以做到并且更优雅。)
PS使用 reverse() 操作或否定每个元素或某物可能会很有趣,但由于这些是 O(n),它违背了使用二进制搜索使用O(lg n)解决方案的目的,我们可以做一个线性搜索。