我正在写一个打印楼梯的方法,就像
#
##
###
####
#####
######
这是一排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都是最快的。