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

Ruby 获取数组中值的最大连续出现次数,ruby,arrays,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 您可以

下面有没有更优雅的方法来实现这一点:

输入:

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
您可以使用:

这更简洁,但如果性能很重要,我会使用您的方法

编辑:如果您使用的是Ruby 2.2.2,那么在假设输入数组仅由0和1组成时,也可以使用新的Enumerableslice_方法:

怎么样

array = [1, 1, 1, 0, 0, 1, 1, 1, 1, 0]
array.split0.group_by&:size.max.first=>4

唯一不好的事情-split0

注意:这仅适用于带有拆分的rails的ActiveSupportextends阵列

仅适用于ruby实现

array.join.split("0").group_by(&:size).max.first #=> 4
编辑:另一种比Stefan的答案更不一般的方法,因为如果其中有除0和1以外的其他数字,则必须再次展平和拆分,但在这种情况下更易于使用:

array.split(0).max.count
您可以使用:

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

类似于,但通过从以下位置返回nil跳过元素:


我认为使用NoMethodError:[1,1,1,0,0,1,1,1,1,0]:数组的未定义方法“split”会失败。你是想先加入吗?很抱歉,这个方法是rails的ActiveSupport附带的,非常好地使用了chunk!在Ruby 2.2+中,您可以编写chunk&:本身而不是chunk{y}。这相当于我删除的答案,它是不正确的,因为它与OP的算法不同。这将计算任意数量的条纹,而不仅仅是1的条纹。!!这将获得最大块数-如果数组中有其他元素的较大块数,则不特别是最大条纹数1:array.chunk{n | n}。选择{a | a.include?1}.map{y,ys | ys.count}.max。请随时更新或改进您的答案。如果所有元素都可以表示为字符,则可以滥用正则表达式:array.join.scan/1+/.max.size-只是好奇:你为什么会接受一个基本上与旧答案重复的答案?@w0lf我现在接受了一个不同的答案。@DamienRoche是你的数组的某种二进制表示形式?@Stefan否。它表示一连串的输赢0,1。很好!我不知道从chunkingNice中排除了nil值。谢谢。太棒了,我不知道你可以这样做,因为Damien改变了接受的答案,所以删除了我之前的评论,但对误解表示歉意。我对你的答案投了赞成票:
array.split(0).max.count
array.chunk { |n| n }.select { |a| a.include?(1) }.map { |y, ys| ys.count}.max
array.chunk { |x| x == 1 || nil }.map { |_, x| x.size }.max