从Ruby中的数组中查找第二大数字

时间:2011-12-17 11:33:29

标签: ruby

我有一个数组a = [3,6,774,24,56,2,64,56,34]。我需要使用Ruby在单次迭代中找到第二大数字。我如何实现它?

7 个答案:

答案 0 :(得分:14)

简单:

array.sort[-2]

你已经完成了:)

答案 1 :(得分:2)

sort在这里可能有些过分,特别是对于非常大的数组。不太明白“单次迭代”,你的意思是一行吗?

a = [3,6,774,24,56,2,64,56,34]
b = a.shift(2).sort
c = 
  a.inject(b) do |(m2, m), e| 
    case
    when e > m
      [m, e]
    when e > m2
      [e, m]
    else
      [m2, m]
    end
  end
c.first #=> 64

答案 2 :(得分:2)

这有效,但我不确定"单次迭代"

a.max(2)[1]

答案 3 :(得分:1)

只是为了好玩,这个方法在可枚举中得到第N个最大值(你使用bisect模块使插入acc的效率更高)。正如@Victor所指出的那样,只有当数组的长度远大于n时,才会使用它,而另一个简单的array.sort[-n]更快。

module Enumerable
  def max_nth(n)
    inject([]) do |acc, x|
      (acc + [x]).sort[[acc.size-(n-1), 0].max..-1]
    end.first
  end
end

p [1, 5, 2, 32, 2, 41, 15, 55].max_nth(2) #=> 41

答案 4 :(得分:0)

它也有效:

arr.sort.reverse[1]

答案 5 :(得分:0)

对我来说,

a = [3,6,774,24,56,2,64,56,34]

a.uniq # create a new array with the only unique value

a.sort[-2] # find the second greatest value

答案 6 :(得分:0)

array = [1,2,3,4,5,6]
puts array.max(2).last