返回序列中的第一个和最后一个元素
问题描述:
我有一个由连续的增量(+1)序列组成的数组。这里有三个序列的例子:返回序列中的第一个和最后一个元素
sequences = [2,3,4,7,12,13,14,15]
我试图获得每个序列的第一个和最后一个元素,并返回一个数组与这些值。从上面的阵列,其结果应该是这样的:我来了,我认为会工作这个美丽天真的解决方案
[[2,4][7,7][12,15]]
,但它只返回第一个序列。任何想法为什么?和/或任何建议更好的解决方案?
new_array = []
start_point = sequences[0]
end_point = sequences[0]
sequences.map do |element|
if element == end_point + 1
end_point = element
elsif element == end_point
next
else
new_array << [start_point, end_point]
startpoint = element
end_point = element
end
end
return new_array
答
您可以使用chunk_while
找到连续编号:(这也是在文档为例)
sequences.chunk_while { |i, j| i + 1 == j }.to_a
#=> [[2, 3, 4], [7], [12, 13, 14, 15]]
而且map
随着values_at
提取每个子数组的第一个和最后一个元素:
sequences.chunk_while { |i, j| i + 1 == j }.map { |a| a.values_at(0, -1) }
#=> [[2, 4], [7, 7], [12, 15]]
或者更详细:
....map { |a| [a.first, a.last] }
在C语言中思考,但在Ruby中写作,你应该得到一些奖励!但是,在Ruby中这样做通常会导致代码效率非常低下。相反,只要有可能,就可以使用像map,inject,tap和select这样的内置函数式编程方法。所有这些方法都是用C语言实现的,因此解释器在执行算法时要做的事情要少得多。 – Sean