2016-09-21 231 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] } 
相關問題