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