Ruby:反向,变异列表

时间:2016-12-14 23:18:42

标签: ruby reverse

我正在尝试编写一个方法,它可以反转列表,但不会使用.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]

您是否有任何建议如何不再重复原始列表,但只是改变它?

2 个答案:

答案 0 :(得分:0)

根据请求改变原始数组。通过了解列表的最后一个元素位于nil来消除list[list.length-1]

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 }

答案 1 :(得分: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]