【问题标题】:Ruby factorial code runs too slowRuby 阶乘代码运行太慢
【发布时间】:2014-11-13 18:41:11
【问题描述】:

我正在处理this hackerrank challenge

我想试试 ruby​​ 的问题,这是我写的代码:

gets.to_i.times do
    num_people = gets.to_i
    num_people_factorial = (1..num_people).inject(:*) || 1
    numerator = num_people_factorial
    if num_people > 2
        denominator = 2*((1..num_people - 2).inject(:*) || 1)
    elsif num_people == 2
        denominator = 2
    else
        denominator = 10000    
    end
    puts numerator / denominator
end

问题是,当我在我的计算机上运行它时,我得到了正确的答案,但是当我通过 Hackerrank 的系统运行它时,测试用例超时 - 它们执行速度不够快,无法进行评分。

如何优化此代码?

编辑:当我提交此代码时,我看到了以下结果:

【问题讨论】:

  • 我去了该网站并准确地复制粘贴了您的编码并运行了编码。它与他们的测试用例完美配合。
  • 您只是“运行”还是“提交”了代码?因为我现在已经提交了 3 次代码,10 个测试用例中只通过了 3 个
  • 老实说,不想提交您的编码。你可以使用这样的东西:tot = 1; 1.step(i,1).to_a.each { |x| tot=tot*x };总算
  • 显然添加了他的“约束”和规则,但这应该是所有工作本身
  • 这个问题似乎离题了,因为它是关于工作代码的重构和代码审查。 Code ReviewStack Overflow 更合适。

标签: ruby performance algorithm combinations


【解决方案1】:

您必须保持警惕以避免可怕的"XY" question!根据您假设您需要计算阶乘的标题。为什么?你想多了。问题是如果房间里有 N 个人,会发生多少次握手。 N 个人中的每一个人与 (N-1) 个人握手,但每次握手都算两次,所以答案是:

N*(N-1)/2

我不能确定,但​​我希望这将通过基准测试。

由于您可以快速轻松地计算出这个数字,即使没有电脑、计算器甚至纸和铅笔,您现在也可以通过另一种方式在晚宴上给其他客人留下深刻印象。

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多