检查连续的号码

mda*_*mau 5 ruby arrays integer conditional-statements

我有一个m整数数组.我正在寻找一种方法来检查元素是否m是连续的.有没有办法测试连续数字?

我想出了这个代码,当数组长度为4时,它可以工作:

m.count == 4 && (m.max-m.min) == 3
Run Code Online (Sandbox Code Playgroud)

其中错误地返回true[1,1,1,4][0,0,0,3].

iza*_*ban 5

您可以尝试以下方法:

a == (a.min..a.max).to_a && a.count == 4
Run Code Online (Sandbox Code Playgroud)

这仅在阵列按升序排列时有效。[3, 4, 5, 6]将通过,但[4, 3, 5, 6]不会。


Jor*_*ing 5

Enumerable有一个非常方便的方法,调用each_cons方式如下:

[1,2,3,4].each_cons(2).to_a # => [ [1, 2], [2, 3], [3, 4] ]
Run Code Online (Sandbox Code Playgroud)

也就是说,它产生每个连续的n个元素集.在我们的例子中,n是2.

当然,顾名思义,它返回一个Enumerator,因此我们可以将它与其他Enumerable方法链接起来,如all?:

def four_consecutive?(arr)
  return false unless arr.size == 4
  arr.each_cons(2).all? {|a, b| b == a + 1 }
end

four_consecutive?([2,3,4,5])   # => true
four_consecutive?([2,2,2,5])   # => false
four_consecutive?([1,2,3,4,5]) # => false
Run Code Online (Sandbox Code Playgroud)

这种方法具有上述优点,因为all?一旦块返回false就会发生短路,它只会测试数字,直到找到一个不满足条件的对(b == a + 1).当然,只有四个元素,这并没有什么区别 - 除非你在性能很重要的情况下多次调用这种方法.