【问题标题】:How do you reverse order in ruby你如何在红宝石中颠倒顺序
【发布时间】:2016-05-20 03:15:24
【问题描述】:

如何在 Ruby 中编写代码 sn-p,以相反的顺序打印出 1 到 200 之间的每个 3 的倍数?

这是我目前的代码:

(1..200).each do | i | ##loop it then
  if i % 3 == 0

【问题讨论】:

标签: ruby ruby-on-rails-3 ruby-on-rails-4


【解决方案1】:

另外三种不需要数组的方法是:

(1..200).reverse_each { |i| puts i if i % 3 == 0 }

或者:

(200..1).step(-1).each { |i| puts i if i % 3 == 0 }

还有:

200.step(1, -1).each { |i| puts i if i % 3 == 0 }

【讨论】:

    【解决方案2】:

    OP 希望打印范围的某些元素。首先构造一个数组是低效的(但不一定是坏的,当然)。我的回答和其他一些人没有创建数组。

    假设范围的格式为first..last。要打印每个 multiple 元素,以相反的顺序,您可以编写:

    def rev_n_skip(first, last, multiple)
      (first..last).step(multiple).reverse_each { |i| print "#{i} " }
      puts
    end
    
    rev_n_skip(1, 19, 3) #-> 19 16 13 10 7 4 1 
    rev_n_skip(1, 18, 3) #-> 16 13 10 7 4 1 
    rev_n_skip(1, 17, 3) #-> 16 13 10 7 4 1 
    rev_n_skip(1, 16, 3) #-> 16 13 10 7 4 1 
    rev_n_skip(1, 15, 3) #-> 13 10 7 4 1 
    
    rev_n_skip(2, 19, 3) #-> 17 14 11 8 5 2 
    rev_n_skip(2, 18, 3) #-> 17 14 11 8 5 2 
    rev_n_skip(2, 17, 3) #-> 17 14 11 8 5 2 
    rev_n_skip(2, 16, 3) #-> 14 11 8 5 2 
    rev_n_skip(2, 15, 3) #-> 14 11 8 5 2 
    

    【讨论】:

      【解决方案3】:

      打印从 200 到 1 的三的倍数的最简单方法是使用 Integer#downto

      200.downto(1) do |i|
        puts i if i % 3 == 0
      end
      

      与其他答案不同,它不需要将范围转换为数组或创建数组并反转它。

      【讨论】:

        【解决方案4】:

        您可能想要#select#reverse

        puts (1..200).select { |i| i % 3 == 0 }.reverse
        

        【讨论】:

        • OP 只想打印元素。没有必要创建一个数组来做到这一点。
        【解决方案5】:

        这行得通:

        (1..200).to_a.reverse.each do |number|
          if number % 3 == 0
          puts number
          end
        end
        

        在这里,您要指定从 1 到 200 的数字范围,将它们转换为数组,颠倒顺序并遍历每个元素以查看它是否可被 3 整除(即,如果将其除以 3,它应该t 有余数),如果有,则打印数字 :)

        编辑:正如乔丹指出的那样,写作

        reverse_each 
        

        而不是

         reverse.each 
        

        效率更高。

        【讨论】:

          【解决方案6】:

          Range 没有#reverse 方法,但您可以调用#to_a 以返回这些数字的数组,然后在该数组上调用#reverse_each 以倒序遍历这些数字:

          (1..200).to_a.reverse_each { |i| puts i if i % 3 == 0 }
          

          有关详细信息,请参阅 RangeArray 上的文档。

          【讨论】:

          • 我建议Array#reverse_each 而不是reverse.each
          • Ruby 总是让我惊叹不已。不会保存单个字符但仍然感觉更干净的语法糖......
          • 这不是语法糖。它有不同的语义。 reverse 初始化第二个数组(第一个数组的副本以相反的顺序),而 reverse_each 从头到尾迭代原始数组。
          • to_a 是不必要的,也是不可取的,因为它会创建一个不需要的临时数组。
          【解决方案7】:

          您可以尝试将值分配给变量 a 然后您可以:

          a.reverse!
          puts a
          

          作为示例,这也可能有所帮助:

          def reverse_string(string) # method reverse_string with parameter 'string'
            loop = string.length       # int loop is equal to the string's length
            word = ''                  # this is what we will use to output the reversed word
            while loop > 0             # while loop is greater than 0, subtract loop by 1 and add the string's index of loop to 'word'
              loop -= 1                  # subtract 1 from loop
              word += string[loop]       # add the index with the int loop to word
            end                        # end while loop
            return word                # return the reversed word
          end                        # end the method
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-10
            • 1970-01-01
            • 2010-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多