2

我正在尝试创建一个函数来检查数组中的两个数字的和是否为零。

[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
4

6 回答 6

3

您想知道 2 个元素的任意组合加起来是否为零。你几乎可以一字不差地写下来:

arr.combination(2).any? {|a, b| (a + b).zero? }
于 2013-10-08T00:41:04.207 回答
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
于 2013-10-08T00:34:50.673 回答
1

一个简单的方法是:

def zero_sum?(arr)
  arr.count(0) > 1 or
  arr.-([0]).any?{|e| arr.include?(-e)}
end
于 2013-10-08T00:41:53.767 回答
1

另一种方法: -

array.product(array).any?{|arr| arr.sum.zero?}
于 2013-10-08T14:55:01.717 回答
0
arr.count(0) > 1 or 
  arr.uniq.map(&:abs).group_by(&:to_i).values.map(&:size).max > 0

我真的不认为这是最好的答案,但它可能会引起某人的兴趣。(之前or从@sawa借来的部分。)

于 2013-10-08T03:50:21.740 回答
0
arr.each_cons(2).select{|array|array.inject(:+) == 0}.count > 0
于 2014-09-29T02:17:40.000 回答