2016-12-14 53 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]