检查数组中两个不同数字的总和是否等于变量数?

10 ruby arrays math boolean

在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)