我有一个包含数字列表的数组,例如
[10, 30, 50, 54, 56, 95, 97, 99]
如果我提供一个例如52,它需要返回数组中的下一个最小数字,在这种情况下为50。
最干净的方法是什么?
请说明是否必须先排序数组。
答案 0 :(得分:9)
我会选择这样的东西(不需要排序):
[10, 30, 50, 54, 56, 95, 97, 99].select {|n| n < 52}.max
答案 1 :(得分:2)
我认为这可以用于排序数组:
[10, 30, 50, 54, 56, 95, 97, 99].sort.reverse.find { |el| el < number }
它只是将排序方向更改为降序并找到第一个较小的元素
答案 2 :(得分:1)
使用排序数组执行此操作的另一种方法是在其反向使用Array#bsearch
:
[10, 30, 50, 54, 56, 95, 97, 99].reverse.bsearch { |n| n < 52 } # => 50
答案 3 :(得分:1)
使用detect代替select,因为select迭代遍历所有元素。 detect返回匹配的第一个匹配项。
数组不必排序。
[10, 30, 50, 54, 56, 95, 97, 99].sort { |a, b| b <=> a }.detect { |v| v <= 52 }
答案 4 :(得分:0)
假设数组已排序:
ary = [...]
pivot = 52
ary.partition{|n| n < pivot}[0][-1]
答案 5 :(得分:0)