2013-10-08 53 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 
相关问题