在Ruby中,我想取一组数字,选择2个不同的数字,将这2个数字加在一起,看看那里的天气等于变量x的变量x.这是我使用的代码
def arrayIsEqual? (numArray, x)
return true if numArray.sample + numArray.sample == x
return false if numArray.empty? || numArray.count == 1
end
Run Code Online (Sandbox Code Playgroud)
例如
numArray = [4,2,7,5]
x = 11
Run Code Online (Sandbox Code Playgroud)
arrayIsEqual (numArray, n)应该返回true,因为4 + 7 = n(11)
我如何让它工作?
我不希望它是2个随机数,只是任意2个不同的数字加起来n
Joh*_*lla 12
看起来您正在尝试查看数组中是否有任何两个数字加起来指定的值x.但是,您的代码只是随机选择两个数字并检查这些数字是否相加.
Ruby有这个Array#combination方法,它生成给定长度的所有组合:
def contains_pair_for_sum?(arr, n)
!!arr.uniq.combination(2).detect { |a, b| a + b == n }
end
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
首先,我们根据Ruby约定命名它:每个单词都是separated_by_underscores.所述?在端部是指,该方法是谓词方法,并返回真或假值.
在方法内部,会发生一些事情.让我们一块一块地看一下这条线.
arr:我们采用传入的数组.
<...>.uniq:我们只关注独特元素(因为OP想要选择两个不同的数字).
<...>.combination(2):我们要求长度为2的数组的所有组合.如果数组是[4, 5, 6],我们得到[[4, 5], [4, 6], [5, 6]].
<...>.detect { |a, b| a + b == n }:我们寻找第一个加起来的组合n.如果我们找到一个,那就是该方法的结果.否则,我们得到nil.
!!<...>:最后,我们取得了我们得到的结果detect并将其否定了两次.第一个否定产生一个布尔值(true如果我们得到的值是nil,或者false如果它是其他任何东西); 第二个否定产生一个布尔值,该值与第一个否定的真值相同.这是一个Ruby成语,可以将结果强制为true或者false.
让我们看看它的实际效果:
array = [4, 5, 9, 7, 8]
contains_pair_for_sum?(array, 11)
# => true (because [4, 7] sums to 11)
contains_pair_for_sum?(array, 17)
# => true (because [9, 8] sums to 17)
contains_pair_for_sum?(array, 100)
# => false (no pair matched)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4579 次 |
| 最近记录: |