我有一个find_num
方法,它返回有序数组中指定数字的索引,例如
find_num(6, [1, 4, 6, 9, 13]) #=> 2
但是我的规范还要求如果号码不可用,它会找到下一个最高号码的位置......
find_num(8, [1, 4, 6, 9, 13]) #=> 3
因为9是下一个可用的号码。
在实现这个问题时遇到了麻烦......我想过迭代整个数组但是我被告知考虑到数组可能很大......
答案 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_index
的binary 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