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

我试图找出n是否作为传递数组中任意两个数字的总和存在,如果是这样返回true否则我的代码的问题是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) 

这是一种方法:

 def sum_to_n?(a,n) !!a.find{|e| a.include?(ne)} 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?(ne)} 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中减去它。 现在我只是测试源数组中是否存在(ne)如果我发现匹配#find将停止查找,并立即返回e 。如果找不到,那么它将进行下一次迭代。 如果#find完成其迭代但未找到(ne) ,则根据文档它将返回nil

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

 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 

从来没有一个人轻松做事:

 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。
 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]] 

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}}。拒绝(&:空?)
结束

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

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