查找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]]