首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中使用堆栈类来计算最大值,得到平均值、pop、push

在Ruby中使用堆栈类来计算最大值,得到平均值、pop、push
EN

Code Review用户
提问于 2016-12-20 15:33:27
回答 2查看 206关注 0票数 5

类的优化程度是否足以接受堆栈中的100万项?

代码语言:javascript
运行
复制
class Stack

attr_accessor :stacks

def initialize() 
    @stacks = []
end

def max ()
    #first we could Think by 
    #sort the stack 
    #then take the last element 
    #but I think it is not efficent 
    if @stacks.size == 0
        return puts"Error no input"
    elsif @stacks.size == 1
        @stacks.first           
    else
    return @stacks.max
    end     
end

def push(value)
    @stacks.push(value)
end

def pop()
    if @stacks.size == 0
        return puts"Error no input" 
    else
        @stacks.pop
    end
    return @stacks
end

end

class Extras < Stack

def average()
    if @stacks.size == 0
        return puts"Error no input" 
    elsif @stacks.size == 1
        return @stacks.first
    else    
        #used inject instead of loop to get more familiar with ruby 
        sum = @stacks.inject(0, :+)
        lenght = @stacks.size
        averages = sum / lenght
        return averages
    end
end
end


users = Extras.new
puts users.push(1)
puts users.push(5)
puts users.push(3)
users.pop
puts users.push(10)
puts users.average
EN

回答 2

Code Review用户

回答已采纳

发布于 2016-12-20 17:42:04

这里的代码实际上只是包装了ruby库中的Array类。因此,您的性能将与使用Array本身完全相同。数组可以在RAM中保存尽可能多的项,并且性能将取决于您正在运行的任何机器。

ruby数组类是用C编写的,性能相当好。你问优化,但你没有给出任何标准,所以我不能真正推测超过这一点。如果您需要的东西非常快,或需要跨越数百万或数十亿项,您可能需要查看另一种语言,甚至数据库。

查看您的代码,您有几个模式if-elsif-else的实例。后两者是多余的,可以合并。例如,包含一个项的数组的最大值将是一个项,您不必将其分解。同样地,对于做平均,你可以用一个项目来平均一个列表,你仍然会得到正确的答案。

代码语言:javascript
运行
复制
def max ()
    # returning 'puts' is _very_ unusual.  It would be better to return nil, which Array#max would do anyway
    return puts "Error no input" if @stacks.empty?   
    @stacks.max     # the last expression is returned automatically
end

def average()
    return puts"Error no input" if @stacks.empty?

   sum = @stacks.inject(0, :+)
   sum / @stacks.size # note that if you sum an array of integers this way, the final average will also be an integer unless you convert something to a float first
end
票数 2
EN

Code Review用户

发布于 2017-04-01 19:03:44

Ruby2.4包括数组的求和方法。

代码语言:javascript
运行
复制
my_arr = [1,2,3,4,5].sum
#=> 15
['foo', 'bar'].sum # concatenation of strings
#=> "foobar" 

http://ruby-doc.org/core-2.4.0/Array.html

您不再需要减少或注入来获得数组的和!

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/150398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档