下面是否有更优雅的方法来实现这一目标:
输入:
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
答案 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
答案 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
方法(假设你的输入数组只包含0
和1
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