2013-10-06 73 views
0
def peel array 
    output = [] 

    while ! array.empty? do 
    output << array.shift 
    mutate! array 
    end 

    output.flatten 
end 

我沒有收入mutate!方法,因爲我只想刪除輸出變量。變種!調用很重要,因爲我們無法遍歷數組,因爲數組正在改變。如何重構此代碼以刪除輸出變量?

編輯:我得到一個數組作爲輸出,這是我想要的。該方法工作正常,但我認爲有一種方法可以在不使用臨時變量的情況下收集array.shift值。

編輯#2:好的,這裏是mutate!方法和測試用例:

def mutate! array 
    array.reverse! 
end 

a = (1..5).to_a 
peel(a).should == [ 1, 5, 2, 4, 3 ] 

如果peel修改數組沒關係。我想它應該被稱爲peel!。是的,每個元素被移除後必須調用mutate!

+1

你在此刻變得作爲輸出,並且你要得到什麼? – dax

+0

@dax意味着如果可以包含一些示例輸入和預期的相應輸出將會很有幫助,這樣我們就可以看到如何在不中斷功能的情況下簡化代碼。完整的代碼實際執行(一個簡單的例子)也可以幫助我們幫助你。 –

+1

有太多的細節錯過能夠給出有價值的答案。原始數組是否被'peel'方法修改是重要的,還是僅僅是使用'shift'的一個無意的副作用?每個元素添加後調用mutate!是否很重要?它有什麼作用? –

回答

1

所有這些扭轉讓我頭暈目眩。

def peel(array) 
    indices = array.size.times.map do |i| 
    i = -i if i.odd? 
    i = i/2 
    end 
    array.values_at(*indices) # indices will be [0, -1, 1, -2, 2] in the example 
end 

a = (1..5).to_a 
p peel(a) #=>[1, 5, 2, 4, 3] 
+0

我認爲目標是避免使用臨時變量,如問題中的'output'或索引'這裏。 –

+0

@Cary啊是的。第一個版本就像'array.size.times.map {| i | i = -i如果i.odd? i = i/2;數組[i]}'但我猜'values_at'會表現更好,忘記了原來的問題。 – steenslag

+0

'array.size.times'可以寫成'array.each_index'。我個人發現有點容易閱讀。 –

0

下面是使用平行作業的方式:

def peel array 
    n = array.size 
    n.times {|i| (n-2-2*i).times {|j| array[n-1-j], array[n-2-j] = array[n-2-j], array[n-1-j]}} 
    array  
end 

peel [1,2,3,4,5] # => [1,5,2,4,3] 
peel [1,2,3,4,5,6] # => [1,6,2,5,3,4] 

我在做什麼這裏是一系列成對交流。通過舉例的方式,爲[1,2,3,4,5,6],第一6-2 = 4步(6是所述數組的大小)改變所述陣列如下:

[1,2,3,4,6,5] 
[1,2,3,6,4,5] 
[1,2,6,3,4,5] 
[1,6,2,3,4,5] 

的1,6和2是在現在的權利位置。我們重複這些步驟,但這次只有6-4 = 2倍,移動5和3到正確的位置:

[1,6,2,3,5,4] 
[1,6,2,5,3,4] 

四是被推到了最後,這是正確的位置,所以我們完成。

1

另一種方法:

def peel(array) 
    mid = array.size/2 
    array[0..mid] 
    .zip(array[mid..-1].reverse) 
    .flatten(1) 
    .take(array.size) 
end 

用法:

peel [1,2,3,4,5,6] 
#=> [1, 6, 2, 5, 3, 4] 

peel [1,2,3,4,5] 
#=> [1, 5, 2, 4, 3] 
+0

不需要評論混亂。我建議你刪除你的,然後當我看到你這樣做時,我會刪除這個。 –

+0

非常漂亮,p11y! –