查找n是否作为给定数组中任意2个数字的总和存在

时间:2013-10-20 16:59:18

标签: ruby each inject

我试图找出n是否作为传递数组中任意两个数字的总和存在,如果这样返回true else false,我的代码的问题是{{ 1}}不是我想要的迭代。我做错了什么?

inject

5 个答案:

答案 0 :(得分:2)

这是一种方法:

def sum_to_n?(a,n)
  !!a.find{|e| a.include?(n-e)}
end
a = [1,2,3,4,5]
sum_to_n?(a,9) # => true
sum_to_n?(a,11) # => false

如果你想获得这两个元素:

def sum_to_n?(a,n)
  num=a.find{|e| a.include?(n-e)}
  unless num
    puts "not exist"
  else
    p [n-num,num]
  end
end
a = [1,2,3,4,5]
sum_to_n?(a,9)
# >> [5, 4]
sum_to_n?(a,11)
# >> not exist

逻辑

Enumerable#find方法每次迭代传递一个数组元素。现在任何迭代,比如我有一个元素e,我从n中减去它。现在我只测试源数组中存在(n-e)。如果我发现匹配#find将停止查找,并立即返回e。如果找不到,那么它将会去用于下一次迭代。如果#find完成其迭代但未找到(n-e),则根据文档,它将返回nil

答案 1 :(得分:2)

这个问题已经得到解答,但我认为这种方法更具可读性:

def sum_to_n?(a,n)
  a.combination(2).find{|x,y| x+y==n}
end

a = [1,2,3,4,5]
p sum_to_n?(a,9)  # => [4, 5]
p sum_to_n?(a,11) # => nil

答案 2 :(得分:1)

从来没有一个人以简单的方式做事:

n = 14
a = [1,3,5,9,13,3,18]
if n==0
  a.select {|x| x == 0}.size > 1
else
  a.map {|x| 2*x - n}.uniq.group_by(&:abs).values.map(&:size).max > 1 # => true
end
  • 表示n!= 0,双值并减去n => [-12,-8,-4,4,12,-8,22]。我们现在正在寻找总和为零的对。
  • uniq => {-12,-8,-4,4,12,22]如果a有重复(两个3' s)。如果没有uniq,我们将在下一步遇到麻烦。
  • 按绝对值分组=> {12 => [ - 12,12],8 => [ - 8],4 => [ - 4,4],22 => [22]}。大小为2的哈希值对应于总和为n的对(1 + 13 => [-12,-12]和5 + 9 => [-4,4])。
  • 选择哈希值,并映射到.size => [2,1,2,1],然后看[2,1,2,1] .max> 1。

答案 3 :(得分:0)

arr = [1, 2,3,4,5,6,7]

num = 7  (given number for 2 element combination)

以下程序只返回单一组合

arr.uniq.combination(2).detect {|a, b| a + b == num}

=> [2, 5]

以下程序将返回所有可能的组合

arr.uniq.combination(2).find_all {|a, b| a +b == num}

=> [[2, 5], [3, 4]]

答案 4 :(得分:0)

<强> RUBY

此代码将拒绝空数组并返回带有值的正确数组。

def find_sequence(val,num)
b = val.length(0..b - 1).map {| n | val.uniq.combination(n).each.find_all {| value | value.reduce(:+)== num}}。拒绝(&amp;:empty?)

val = [-10,1,-1,0,0] num = 2

输出将是[[2],[2,0],[ - 1,1,2],[ - 1,1,2,0]]