2013-10-08 52 views
0

我試圖創建一個函數來檢查數組中的兩個數字是否總和爲零。在Ruby中查找數組中兩個數字的總和

[1,2,3,4,5] => false 
[1,2,3,-2,5] => true 

這是我迄今爲止,但我無法弄清楚:

def zero_sum?(arr) 

    arr.each do |num| 
    arr.each do |num2| 
     if (num.to_i + num2.to_i) == 0 
     true 
     else 
     false 
     end 
    end 
    end 

end 

回答

3

你想知道是否2種元素的任意組合增加最多爲零。你幾乎可以把它寫下來逐字:

arr.combination(2).any? {|a, b| (a + b).zero? } 
+0

爲包含單個零的列表提供不同的結果。但是,英語的措詞也是如此。我被撕裂了。 – Amadan

+0

@Amadan'combination'不會混合兩個相同索引的數組元素,這就是爲什麼單個'0'產生錯誤。 – lurker

+0

@mbratch:是的,我知道爲什麼。我只是說OP在他的英文和他的代碼中有不同的期望。我遵循了代碼,Jörg接着說了句,因此我們得到了不同的結果。只有OP可以說誰是對的。 :) – Amadan

2

你需要return true而不是true

這樣,塊中的值在需要時爲true,但循環繼續,最後each返回arr

而且,可以寫短,但效率不高:

def zero_sum?(arr) 
    arr.product(arr).any? { |x, y| x + y == 0 } 
end 

少一點不錯,但效率:

def zero_sum?(arr) 
    arr.product(arr) { |x, y| return true if x + y == 0 } 
    false 
end 
+0

爲了擴大對「效率」的意見:雙方的解決方案是O(N²),但實際第二個的時間複雜度平均是第一個的一半,而第二個的複雜度僅爲第一個的1/1。 –

1

一種簡單的方法來做到這一點是:

def zero_sum?(arr) 
    arr.count(0) > 1 or 
    arr.-([0]).any?{|e| arr.include?(-e)} 
end 
+0

我找不出什麼'arr。 - ([])'直到我刪除了這個點,發現它沒有區別。由於parens只是爲了避免'] .',所以它和'(arr- [0])'是一樣的。你也可以使用'arr.uniq',但那不會描述。 –

0
arr.count(0) > 1 or 
    arr.uniq.map(&:abs).group_by(&:to_i).values.map(&:size).max > 0 

我真的不認爲這是最好的答案,但它可能是對某人感興趣。 (or從@sawa之前借來的一部分。)

1

另一種方式來做到這一點: -

array.product(array).any?{|arr| arr.sum.zero?} 
0
arr.each_cons(2).select{|array|array.inject(:+) == 0}.count > 0 
相關問題