在Ruby中查找数组中的第二大数

1cosmwyk  于 2023-01-12  发布在  Ruby
关注(0)|答案(8)|浏览(142)

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

6kkfgxo0

6kkfgxo01#

简单:

array.sort[-2]

你已经完成了:)

mznpcxlj

mznpcxlj2#

这是可行的,但我不确定是否适用于“单次迭代”
a.max(2)[1]

pgvzfuti

pgvzfuti3#

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
vnzz0bqm

vnzz0bqm4#

只是为了好玩,这个方法会得到一个可枚举对象中第N个最大的值(你可以使用一个bisect模块来提高插入acc的效率),正如@维克托所指出的,只有当数组的长度远远大于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
bfrts1fy

bfrts1fy5#

它也很有效:

arr.sort.reverse[1]
a6b3iqyw

a6b3iqyw6#

对我来说,

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
flvtvl50

flvtvl507#

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

ifsvaxew8#

对我来说,这很管用:data_array5 = [45,65632,232,34345,343,23,23,56]
puts data_array5.sort[data_array5.length()-2]
这是通用的,你可以用任意n个数字替换2来得到第n个最大值

相关问题