使用Ruby打印楼梯的最佳方法是什么?

时间:2016-05-31 08:23:53

标签: ruby

我正在写一个打印楼梯的方法,就像

     #
    ##
   ###
  ####
 #####
######

这是一排6排。所以我想出了这个代码:

def print_staircase(num_rows)
  for i in (1..num_rows)
    puts ' ' * (num_rows-i) + '#' * i
  end
end

print_staircase(6)
=>
     #
    ##
   ###
  ####
 #####
######

所以它有效,但我认为这是一种低效率,更好的解决方案吗?

因为如果num_rows很大,那么我们每次都会像' ' * (n-i) + '#' * i一样构造结果,我认为这不是一个好主意!

3 个答案:

答案 0 :(得分:4)

您可以创建一个初始字符串,并在每次迭代时设置#

def print_staircase(num_rows)
  str = ' ' * num_rows
  1.upto(num_rows) do |i|
    str[-i] = '#'
    puts str
  end
end

这会重复使用str,而不是每次都创建一个新的字符串实例。

但通常,你会看到类似的东西:

def print_staircase(num_rows)
  1.upto(num_rows) { |i| puts ('#' * i).rjust(num_rows) }
end

答案 1 :(得分:1)

首先需要定义一个等于空字符串的变量。然后使用一个循环,总是向它添加一个'#'并显示它。这将在每次迭代后保存当前值,您需要在字符串中添加单个“#”,而不是在每次迭代中从头开始重新计算。

答案 2 :(得分:1)

有很多方法可以做到这一点,你的是一个解决方案,对我来说似乎很好。如果实施了两个额外的解决方案和基准。您的解决方案是这三个中最快的(微基准免责声明适用,特别是因为我使用put / print执行IO)。 def staircase_0(大小)   string =' ' *(大小 - 1)+'#' *大小   size.times do | offset |     puts string [offset ...(offset + size)]   结束 结束 def staircase_1(大小)   prefix =' ' *(大小 - 1)   postfix ='#'   尺寸时间     打印前缀     把postfix     prefix =前缀[1 ..- 1]     后缀+ ='#'   结束 结束 def staircase_2(num_rows)   for i in(1..num_rows)     put' ' *(num_rows-i)+'#' * 一世   结束 结束 要求'基准/ ips' Benchmark.ips做| x |   x.report(' _0')做     staircase_0(6)   结束   x.report(' _1')做     staircase_1(6)   结束   x.report(' _2')做     staircase_2(6)   结束   x.compare! 结束 结果如下: 比较:                   _2:35649.0 i / s                   _0:29716.3 i / s - 慢1.20倍                   _1:25848.2 i / s - 慢1.38倍 请注意,由于IO,结果可能会有很大差异。 IO很慢(因此它比你的算法和字符串连接更重要)。它也是不可预测的,并且可能因运行而异。因此,更高效(就运行时而言)解决方案可能只输出一个字符串: def staircase_3(大小)   string =''   size.times do | index |     string + =' ' *(size - index - 1)+'#' *(指数+ 1)+" \ n"   结束   把字符串 结束 事实上,当我运行基准测试时,速度更快: 比较:                   _3:52923.7 i / s                   _0:36377.7 i / s - 慢1.45倍                   _2:33508.7 i / s - 慢1.58倍                   _1:25991.6 i / s - 慢2.04倍 另请注意,在此运行中,您的算法版本(staircase_2)比stairs_0慢...这是因为IO。但是在我的所有跑步中,stairs_3都是最快的。