2016-12-14 62 views
0

我想寫一個方法,它顛倒了列表,但沒有使用.reverse。 這裏是我的代碼:紅寶石:反向,變異列表

def reverse(list) 

    a = list.length 

    while a >= 0 
    list << list[a] 
    a = a - 1 
    end 
    list 
end 

print reverse([1,2,3]) 

我預期的結果是不是[3,2,1],但[1,2,3,零,3,2,1]

你有什麼建議如何不再重複原始列表,但只能改變它?

+0

我已經更新了我的答案,看到一個更Rubyish方法。 –

回答

0

變異原始數組按要求。知道列表的最後一個元素是list[list.length-1],因此排除了nil

def reverse(list) 
    a = list.length-1 
    while a >= 0 
    list << list[a] 
    list.delete_at(a) 
    a = a - 1 
    end 
    list 
end 

p reverse([1, 2, 3]) #=> [3, 2, 1] 

更Ruby的方法可能如下:

arr.sort_by!.with_index { |_,i| -i } 
0

我理解名單已到位(突變)被逆轉。以下是兩種方式來做到這一點。

如果列表不被突變,只需在副本上操作:

def non_mutating_reverse(list) 
    reverse(list.dup) 
end 

#1

使用平行分配(有時稱爲多種分配)。

def reverse(list) 
    (list.size/2).times { |i| list[i], list[-1-i] = list[-1-i], list[i] } 
    list 
end 

list = [1,2,3] 
reverse list  #=> [3, 2, 1] 
list    #=> [3, 2, 1] 

請注意,當列表大小爲奇數時(如本例中),中間元素不會移動。

#2

def reverse(list) 
    list.replace(list.size.times.with_object([]) { |i,a| a.unshift(list[i]) }) 
end 

list = [1,2,3] 
reverse list  #=> [3, 2, 1] 
list    #=> [3, 2, 1]