我有一个整数数组m
。我正在寻找一种方法来检查 m
的元素是否连续。有没有办法测试连续数字?
我想出了这段代码,旨在在数组长度为四时工作:
m.count == 4 && (m.max-m.min) == 3
对于 [1,1,1,4]
或 [0,0,0,3]
错误地返回 true
。
最佳答案
Enumerable 有一个非常方便的方法叫做 each_cons
是这样工作的:
[1,2,3,4].each_cons(2).to_a # => [ [1, 2], [2, 3], [3, 4] ]
也就是说,它会生成每组连续的 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
这个方法比其他方法有优势,因为 all?
一旦 block 返回 false 就会短路,它只会测试数字,直到找到不满足条件的一对(b == a + 1
)。当然,只有四个元素这并没有什么不同——除非你在性能很重要的情况下调用这个方法数千次。
关于arrays - 检查连续数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32973830/