我试图找出n
是否作为传递数组中任意两个数字的总和存在,如果这样返回true
else false
,我的代码的问题是{{ 1}}不是我想要的迭代。我做错了什么?
inject
答案 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
a
有重复(两个3' s)。如果没有uniq,我们将在下一步遇到麻烦。答案 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]]