0

我试图找出是否n存在作为传递数组中任意两个数字的总和如果返回trueelse false,我的代码的问题是它inject没有按我想要的那样迭代。我究竟做错了什么?

def sum_to_n?(array,n)
  array.each do |i|
    array.inject(i) do |memo,var|
      if memo + var == n
        return true
      else
        return false
      end
    end
  end
end

puts sum_to_n?([1,2,3,4,5],9)
4

5 回答 5

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
于 2013-10-21T11:19:33.367 回答
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

于 2013-10-20T17:07:17.690 回答
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)。如果没有 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。
于 2013-10-21T07:55:27.097 回答
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]]
于 2016-05-28T07:07:11.797 回答
0

红宝石

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

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

val = [-10, 1, -1, 2, 0] 数字 = 2

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

于 2018-04-09T13:06:31.783 回答