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

5
这里有一种更为优美的方法来实现以下内容吗:
输入:
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.join.scan(/1+/).max.size ;-) - Stefan
只是好奇:为什么您会接受一个基本上是旧答案的副本的答案? - Cristian Lupascu
@DamienRoche,你的数组是否是某种二进制表示? - Stefan
@Stefan 不是。它代表了一串连续的胜利/失败(0和1)。 - Damien Roche
4个回答

6

编辑: 另一种实现此功能的方法(比Stefan的答案更具体化,因为如果存在0和1之外的其他数字,您将不得不再次展开和拆分,但在这种情况下更易于使用):

array.split(0).max.count

您可以使用以下方法:
array.chunk { |n| n }.select { |a| a.include?(1) }.map { |y, ys| ys.count}.max

参考:如何计算Ruby数组中元素的连续出现次数?


非常好的使用了块! - Anthony
3
在 Ruby 2.2 及以上版本中,你可以使用 chunk(&:itself) 来代替 chunk { |y| y } - Stefan
2
这与我删除的答案相当,并且是不正确的,因为它与 OP 的算法不同。这计算任何数字的连续出现次数,而不仅仅是 1 的连续出现次数。 - Cristian Lupascu
2
这将获取最大的块 - 不一定是 1 的最大连续段(如果数组中有其他元素的更大块)。 - SHS
这似乎是有效的:array.chunk { |n| n }.select { |a| a.include?(1) }.map { |y, ys| ys.count}.max。请随意更新您的答案或改进它。 - Damien Roche
@DamienRoche 更新 - 谢谢,我误解了问题,认为您想要任何数字的最大连续出现次数。 - Sid

6
类似于w0lf的回答,但是通过从chunk返回nil来跳过元素:
array.chunk { |x| x == 1 || nil }.map { |_, x| x.size }.max

2
不错!我不知道nil值被排除在chunk之外。 - Cristian Lupascu
了解了,谢谢。 - Damien Roche
太棒了,我也不知道你可以这样做。 - Sid

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):

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

抱歉之前删除了我的评论,因为达米恩更改了接受的答案,但是对于误解我表示歉意。我已经给你的答案点赞 :) - Sid

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 扩展了 Array)

对于纯 Ruby 实现:

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

我认为它会失败,并显示NoMethodError: undefined method \split' for [1, 1, 1, 0, 0, 1, 1, 1, 1, 0]:Array`。 - toro2k
你是不是想先使用 join 函数?无论如何,似乎都不起作用。 - Damien Roche
1
抱歉,这个方法是Rails的ActiveSupport中的一部分。 - Avdept

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接