2016-01-14 159 views
-4

選擇從陣列的連續整數我想從陣列選擇連續的整數,例如:在紅寶石

輸入:(不必進行排序)

array = [1, 3, 6, 7, 8, 9, 10, 12, 13, 17] 

預期輸出:

#=> [6, 7, 8, 9, 10, 12, 13] 

這是我到目前爲止的代碼:

array = [1, 3, 9, 6, 7, 10, 8, 12, 13, 17] 
newarray = [] 
z = 0 
array.sort.each_cons(2) do |x, y| 
    if y == x + 1 
    if z == 0 
     newarray.insert(0, x, y) 
    else 
     newarray.push(y) 
    end 
    end 
    z = z + 1 
end 

newarray #=> [7, 8, 9, 10, 13] 

正如您所見,612丟失。

我的代碼出了什麼問題,除了bug之外,還有更好的方法來寫它嗎?

+7

有一個Stack Exchange站點專門爲代碼審查這可能是一個更好的地方要問:HTTP ://codereview.stackexchange.com/您還應該提供更多示例輸入和輸出,並解釋您的代碼*應該*做的事情。例如。 '[1,2,3,6,5]'的正確輸出是否應該是'[1,2,3,6]'(即它會錯過5的值)? –

+0

更正了問題@NeilSlater –

+1

用英文書寫時請使用英文標點符號。 – sawa

回答

5

您的代碼相鄰的元件相比較xy,但推xy僅當它們的陣列(if z == 0; newarray.insert(0, x, y))在所述第一元件。否則,只推送y,因此每個連續整數組中的第一個元素缺失。

下表說明這是怎麼回事:

z = true 
array.sort.each_cons(2) do |x, y| 
    if y == x + 1 
    if z 
     newarray.push(x, y) 
     z = false 
    else 
     newarray.push(y) 
    end 
    else 
    z = true 
    end 
end 

一個更好的辦法是使用chunk_while

x y y == x+1 
-------------------- 
    1 3 false 
    3 6 false 
    6 7 true  #=> push(7) 
    7 8 true  #=> push(8) 
    8 9 true  #=> push(9) 
    9 10 true  #=> push(10) 
10 12 false 
12 13 true  #=> push(13) 
13 17 false 

您可以通過使用z爲一組的開始的指示解決您的代碼這是在Ruby 2.3中引入的:

array = [1, 3, 9, 6, 7, 10, 8, 12, 13, 17] 

array 
    .sort        #=> [1, 3, 6, 7, 8, 9, 10, 12, 13, 17] 
    .chunk_while { |x, y| y == x + 1 } #=> [[1], [3], [6, 7, 8, 9, 10], [12, 13], [17]] 
    .select { |a| a.size > 1 }   #=> [[6, 7, 8, 9, 10], [12, 13]] 
    .flatten       #=> [6, 7, 8, 9, 10, 12, 13] 

您是否注意到文檔中包含類似的示例?

例如,一個接一個遞增子可以分塊如下:

a = [1,2,4,9,10,11,12,15,16,19,20,21] 
b = a.chunk_while {|i, j| i+1 == j } 
p b.to_a #=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]