【问题标题】: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]}

【问题讨论】:

    标签: ruby arrays iteration


    【解决方案1】:

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

    1. 数组可以通过索引访问
    2. 将索引设置为数组的长度,然后减1,直到索引达到0
    3. 输出到屏幕或新数组或使用循环执行任何逻辑。

          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 实际上会向后遍历而不实际反转数组。
        猜你喜欢
        • 2021-09-01
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        • 2022-01-21
        • 2017-02-21
        • 1970-01-01
        • 2011-01-15
        • 2017-01-28
        相关资源
        最近更新 更多