ruby找到下一个可用数字的索引

时间:2016-05-25 12:39:02

标签: ruby

我有一个find_num方法,它返回有序数组中指定数字的索引,例如

find_num(6, [1, 4, 6, 9, 13]) #=> 2

但是我的规范还要求如果号码不可用,它会找到下一个最高号码的位置......

find_num(8, [1, 4, 6, 9, 13]) #=> 3

因为9是下一个可用的号码。

在实现这个问题时遇到了麻烦......我想过迭代整个数组但是我被告知考虑到数组可能很大......

3 个答案:

答案 0 :(得分:6)

你可以将一个块传递给index并且它......

  

[...]返回块返回true的第一个对象的索引。如果未找到匹配项,则返回nil

示例:

[1, 4, 6, 9, 13].index { |n| n >= 6 }  #=> 2
[1, 4, 6, 9, 13].index { |n| n >= 8 }  #=> 3
[1, 4, 6, 9, 13].index { |n| n >= 15 } #=> nil

因为这需要对数组进行排序,您还可以使用执行bsearch_indexbinary search

答案 1 :(得分:0)

你也可以在这个数组中找到任何元素的索引。

  2.1.8 :040 > [1, 4, 6, 9, 13].index(6)
 => 2
  2.1.8 :041 > [1, 4, 6, 9, 13].index(15)
 => nil 

答案 2 :(得分:0)

def find_num(n,a)
  a.each_with_index.to_a.sort_by(&:first).find { |nbr,_| nbr >= n }.last 
end

find_num(6, [1, 4, 6, 9, 13])
  #=> 2 
find_num(8, [1, 4, 6, 9, 13]) #=> 3
  #=> 3 

的步骤
n = 8
a =  [1, 4, 6, 9, 13]

如下。

b = a.each_with_index.to_a
  #=> [[1, 0], [4, 1], [6, 2], [9, 3], [13, 4]] 
c = b.sort_by(&:first)
  #=> [[1, 0], [4, 1], [6, 2], [9, 3], [13, 4]] 
d = c.find { |nbr,_| nbr >= n }
  #=> [9, 3] 
d.last 
  #=> 3