2014-11-13 64 views
2

我上this hackerrank challenge工作。紅寶石階乘代碼運行速度太慢

我想嘗試與紅寶石的問題,這是我寫的代碼:

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的系統運行它,測試用例超時 - 它們執行的速度不夠快,無法進行評分。

我如何優化此代碼?

編輯:當我提交的代碼,我看到這樣的結果:

enter image description here

+1

我親臨現場,並複製粘貼您的編碼準確,跑了編碼。它與他們的測試案例完美配合。 –

+0

你剛剛「運行」或「提交」了代碼嗎?因爲我現在已經提交了這個代碼三次,所以只通過了10個測試用例中的三個 – johncorser

+0

不想提交你的編碼是誠實的。你可以使用這樣的東西: tot = 1; 1.step(i,1).to_a.each {| x | tot = tot * x};提出TOT –

回答

4

您必須提高警惕,避免可怕的"XY" question!從你認爲你需要計算一個階乘的標題。爲什麼?你在過度思考。問題是房間裏是否有N人,會發生多少次握手。每個N多人的震動與(N-1)的人手中,但每次計數兩次握手,所以答案是:

N*(N-1)/2 

我不能肯定,但我希望這將通過基準測試。

正如你可以快速,輕鬆地計算出這個數字,即使沒有電腦,計算器,甚至紙和筆,你現在有另一種方式在晚宴上打動其他客人。