检查连续数字

时间:2015-10-06 15:27:17

标签: arrays ruby integer conditional-statements

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

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

m.count == 4 && (m.max-m.min) == 3

错误地返回true[1,1,1,4]的{​​{1}}。

5 个答案:

答案 0 :(得分:5)

你可以试试这个:

a == (a.min..a.max).to_a && a.count == 4

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

答案 1 :(得分:5)

Enumerable有一个非常方便的方法each_cons,其工作原理如下:

[1,2,3,4].each_cons(2).to_a # => [ [1, 2], [2, 3], [3, 4] ]

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

当然,顾名思义,它返回一个枚举器,因此我们可以将它与其他可枚举方法(如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

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

答案 2 :(得分:3)

答案基于Sum of consecutive integers

的数学问题
Sum = n∗(n+1)/2

代码:

def check_sum_match?(arr)
  m = arr.min - 1
  n = arr.max
  sum1 = arr.inject{|sum, x| sum = sum + x}
  sum2 = (n*(n+1) - m*(m+1))/2
  sum1 == sum2
end

arr = [5,6,7,8]
if arr.count == 4 && check_sum_match?(arr)
  puts 'Yes condition matches'
else
  puts 'Invalid Array'
end
# valid arrays are
# [4,6,5,7], [4,5,6,7], etc

暂定说明:

enter image description here

答案 3 :(得分:3)

如果a是数组且n是所需大小:

def size_and_consecutive?(a, n)
  a == (a.first..(a.first+n-1)).to_a
end

size_and_consecutive? [3,4,5,6], 4
  #=> true
size_and_consecutive? [4,3,5,6], 4
  #=> false
size_and_consecutive? [3,4,5], 4
  #=> false

答案 4 :(得分:1)

我能想到的一个紧凑的解决方案如下:

def consec(arr)
  is_of_proper_length = (arr.size == 4)
  if(is_of_proper_length)
    are_consec = true
    arr.each_cons(2) {|x,y| are_consec = false unless ((y - x) == 1)}
  end
  is_of_proper_length && are_consec
end

输出:

consec([1,2,3,4])
 => true 
2.2.0 :051 > consec([0,0,0,0])
 => false 
2.2.0 :052 > consec([4,6,5,7])
 => true 
2.2.0 :053 > consec([4,5,6,7])
 => true 
2.2.0 :054 > consec([5,6,7,8])
 => true 
2.2.0 :055 > consec([2,2,2,5])
 => false 
2.2.0 :056 > consec([2,3,4,5])
 => true 
2.2.0 :057 > consec([1,2,3,4,5])
 => false