2016-09-21 176 views
2

我有一个由连续的增量(+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 
+1

在C语言中思考,但在Ruby中写作,你应该得到一些奖励!但是,在Ruby中这样做通常会导致代码效率非常低下。相反,只要有可能,就可以使用像map,inject,tap和select这样的内置函数式编程方法。所有这些方法都是用C语言实现的,因此解释器在执行算法时要做的事情要少得多。 – Sean

回答

5

您可以使用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] } 
相关问题