2013-10-13 46 views
3

我有下面的代碼。方法sum_to_n?以整數數組arr和整數n作爲參數,並且如果arr中的任何兩個元素總和爲n,則返回true。它應該返回true爲空arr與零n,但一直返回false定義一個`sum_to_n?`方法

def sum_to_n?(arr, n) 
    hash = Hash.new(0) 
    arr.each do |val| 
    if hash.key? val 
     return true 
    else 
     hash[n-val] = val 
    end 
    end 
    return false 
end 

我在做什麼錯?

+1

歡迎SO! :-) – fotanus

+1

我假設你的'返回false'是爲了在'def'裏面,對嗎?而且,真的沒有理由將哈希默認爲「0」。 –

+0

感謝所有人的回覆。 –

回答

2

你的代碼是(幾乎)正確的,但你的期望是錯誤的。當有兩個(或一個)元素合計爲n時,您的代碼將返回true。如果你傳遞一個空數組,那麼將不會有任何加起來爲n的元素(因爲數組中沒有元素在第一位)。因此,你得到false

如果您希望它爲空數組返回true,那麼這將是一種不符合邏輯的異常行爲。你將不得不把條件,如

return true if arr.empty? 

在您的代碼。

+1

這個回答'我做錯了什麼?',這就是問題。 @spickermann顯示了一個更好的總體方法來實現OP想要的內容,但這是「正確的答案」。 – fotanus

7

較短的版本:

def sum_to_n?(arr, n) 
    (arr.empty? && n.zero?) || arr.permutation(2).any? { |a, b| a + b == n } 
end 
+0

雖然讓我們也注意到,@ spickermann的算法運行在'O(n²)'中,但再努力一點,這個問題可以在'O(n)'中解決,iianm。 –

+0

偉大的答案!真的很感激它。當我測試: puts sum_to_n?([],1) 它應該返回false爲非零參數的空數組。 :( –

+0

修復了爲空'arr'返回'false'的結果,其中非零'''關於複雜性:只要運行時間較慢並不是問題,取決於代碼的可讀性,取決於問題的嚴重程度。 – spickermann

相關問題