获取数组中最大连续出现的值

时间:2015-04-17 13:42:01

标签: ruby arrays

下面是否有更优雅的方法来实现这一目标:

输入:

array = [1, 1, 1, 0, 0, 1, 1, 1, 1, 0]

输出:

4

我的算法:

streak = 0
max_streak = 0

arr.each do |n|
  if n == 1
    streak += 1
  else
    max_streak = streak if streak > max_streak
    streak = 0
  end
end

puts max_streak

4 个答案:

答案 0 :(得分:6)

编辑:另一种方法(比Stefan的答案更不通用,因为如果那里有另外一个数字而不是0和1,你必须再次展平和拆分,但更容易在这种情况下使用):

array.split(0).max.count

您可以使用:

array.chunk { |n| n }.select { |a| a.include?(1) }.map { |y, ys| ys.count}.max

参考:Count sequential occurrences of element in ruby array

答案 1 :(得分:6)

w0lf's answer类似,但通过从chunk返回nil来跳过元素:

array.chunk { |x| x == 1 || nil }.map { |_, x| x.size }.max

答案 2 :(得分:5)

您可以使用Enumerable#chunk

p array.chunk{|x| x}.select{|x, xs| x == 1}.map{|x, xs| xs.size }.max

更简洁,但如果表现很重要,我会使用您的方法。


编辑:如果你在Ruby 2.2.2中,你也可以使用新的Enumerable#slice_when方法(假设你的输入数组只包含01 s ):

array.slice_when{|x,y| x < y }.map{|slice| slice.count 1 }.max

答案 3 :(得分:0)

怎么样

array = [1, 1, 1, 0, 0, 1, 1, 1, 1, 0]

array.split(0).group_by(&:size).max.first #=> 4

唯一的坏事 - split(0)

注意:这仅适用于rails的ActiveSupport(使用#split扩展数组)

仅用于ruby实现

array.join.split("0").group_by(&:size).max.first #=> 4