如何从最后一个元素开始遍历数组? (红宝石)

Posted

技术标签:

【中文标题】如何从最后一个元素开始遍历数组? (红宝石)【英文标题】:How to iterate through an array starting from the last element? (Ruby) 【发布时间】:2011-01-21 17:10:54 【问题描述】:

我提供了以下解决方案,但我相信那一定是更好的解决方案......

array = [ 'first','middle','last']

index = array.length
array.length.times  index -= 1; puts array[index]

【问题讨论】:

【参考方案1】:

如果你想在不使用反向的情况下达到同样的效果[有时这个问题出现在面试中]。我们需要使用基本逻辑。

    数组可以通过索引访问 将索引设置为数组的长度,然后减1,直到索引达到0

    输出到屏幕或新数组或使用循环执行任何逻辑。

        def reverseArray(input)
          output = []
          index = input.length - 1 #since 0 based index and iterating from 
          last to first
    
          loop do
            output << input[index]
            index -= 1
            break if index < 0
          end
    
          output
        end
    
        array = ["first","middle","last"]
    
        reverseArray array #outputs: ["last","middle","first"]
    

【讨论】:

为什么不只使用 reverse_each?【参考方案2】:

如果您想反向遍历一个范围,请使用:

(0..5).reverse_each do |i|
  # do something
end

【讨论】:

#reverse_each 是否在内部执行反向操作?或者它只是从最后开始并向后工作?如果是后者,这个答案可以实现比分别调用#reverse#each 更好的时间复杂度,因为#reverse 本质上是O(n log n) 的排序操作,而从最后一个到第一个计数与#each 在时间复杂度方面(即 O(n))。【参考方案3】:

在翡翠模板中你可以使用:

for item in array.reverse()
   item

【讨论】:

【参考方案4】:

你甚至可以使用 for 循环

array = [ 'first','middle','last']
for each in array.reverse do
   print array
end

将打印

last
middle
first

【讨论】:

实际上它打印:["first", "middle", "last"]["first", "middle", "last"]["first", "middle", "last" ]【参考方案5】:

鲁比很聪明

a = [ "a", "b", "c" ]
a.reverse_each |x| print x, " " 

【讨论】:

【参考方案6】:
array.reverse.each  |x| puts x 

【讨论】:

我知道nice会有一些东西...谢谢。 其实reverse_each 更好,因为它不像reverse 那样复制数组。 是的,我也希望reverse_each 更好,尽管我还没有深入了解内部结构。 我刚刚做的一些算法的重要说明:.reverse 实际上会反转数组(返回一个新反转的数组,并且在迭代时你仍然会从前到后)。另一方面,.reverse_each 实际上会向后遍历而不实际反转数组。

以上是关于如何从最后一个元素开始遍历数组? (红宝石)的主要内容,如果未能解决你的问题,请参考以下文章

angular在遍历数组之后如何给第一个元素加默认

两数之和

c语言如何遍历枚举元素

c#如何遍历一个list将值传到数组

基础篇:冒泡排序,快速排序

jquery如何遍历一个html页面标题生成目录