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

Posted

技术标签:

【中文标题】检查数组中两个不同数字的总和是不是等于变量数?【英文标题】:Check if the sum of two different numbers in an array equal a variable number?检查数组中两个不同数字的总和是否等于变量数? 【发布时间】:2014-06-27 15:50:34 【问题描述】:

在 Ruby 中,我想获取一个数字数组,选择 2 个不同的数字,将这 2 个数字相加,然后查看那里的天气等于变量 x.y 和变量 x。这是我使用的代码

def arrayIsEqual? (numArray, x)
  return true if numArray.sample + numArray.sample == x
  return false if numArray.empty? || numArray.count == 1
end

例如

numArray = [4,2,7,5]
x = 11

arrayIsEqual (numArray, n) 应该返回 true,因为 4 + 7 = n(11)

如何让它工作?

我不希望它是 2 个随机数,只是任何 2 个不同的数字加起来为 n

【问题讨论】:

+1,感谢您尝试在初学者问题中展示作品,以及您明确表达的问题。欢迎使用 Stack Overflow。 -1。问题不清楚。 “选择 2 个不同的数字和一个变量 x 并查看它们是否相等”是什么意思?哪个等于哪个? -1 并同意sawa..上下文不太清楚.. 您的意思是检查随机抽取的两个数字的总和(这似乎与您的描述相矛盾),还是所有两个数字的总和必须是 x,或者某些两个数字的总和必须是 x? 到目前为止,您有两票要结束,所以您最好立即编辑您的问题(即使您已经选择了一个答案)!不要试图解释你在 cmets 中的意思;进行编辑。一方面,摆脱对随机值的引用,因为它只是模糊不清。保持你的榜样,它说明了(几乎)全部。 【参考方案1】:
def array_is_equal? (num_array, x) 
  equality = 0
  num_array.each do |a|
    equality += 1 if a == x
    return true if equality == 2
  end
  return false
end

在 Ruby 中为变量使用小写和下划线。这里的约定与其他一些语言不同。

【讨论】:

我不确定这就是 OP 的意思——如果有两个或更多相等的元素x,你就数,而 OP 想要两个 sum 相等的元素x。顺便说一句,你写的代码可以通过num_array.count(x) > 1实现【参考方案2】:

我了解您的问题是“我的数组中是否有 任何 对数字等于 x”,在这种情况下,这将满足您的需求:

def has_pair_equal?(num_array, x)
  (0..num_array.length-1).any? do |i| 
    num_array[i+1..-1].any?  |n| n + num_array[i] == x 
  end
end

这将检查数组中所有数字对的总和,并检查它们的总和是否为xsample 随机从数组中选择一个项目,这意味着您的代码所做的是“如果我的数组中有一对数字等于 x,则返回 true sometimes

【讨论】:

我取了你的方法名..请不要介意.. :)【参考方案3】:

您似乎正在尝试查看数组中是否有任何两个数字加起来等于指定值x。但是,您的代码只是随机选择两个数字并检查这些数字是否相加。

Ruby 有Array#combination 方法,它生成给定长度的所有组合:

def contains_pair_for_sum?(arr, n)
  !!arr.uniq.combination(2).detect  |a, b| a + b == n 
end

需要注意的几点:

首先,我们根据 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 习惯用法,用于将结果强制为 truefalse

让我们看看它的实际效果:

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)

【讨论】:

这两个数字必须不同。是的,我不想选择随机数。例如 [4,4,7,8] 不能选择 4。这看起来不错,但我认为您应该使用 arr 而不是数组,因为它是首先定义的 如果你能告诉你不希望帖子本身出现随机数可能对我有帮助.. :) @user3545961:您想看看是否有任意两个数字的值相加?还是您只想查看任意两个唯一数字 @user3545961:我更新了。它现在只会检索唯一的数字(#uniq 就是这样做的)。 @seph 我希望能够证明 which 对实际上也是正确答案,这符合 .detect 的语义。【参考方案4】:

一个班轮

x=[4,2,7,5]; x.each_with_index.any? |y,i| x.each_with_index.any? |z,j| unless i==j; z+y==11; end  

作为一个函数

def pair_sum_match?(arr, x)
    arr.each_with_index.any? do |y,i|
        arr.each_with_index.any? do |z,j|
            unless i==j
                z+y==x
            end
        end
    end
end

更新:添加了 each_with_index 以避免在检查中自我包含。现在时间更长了:-/

【讨论】:

这也将为[1,3,4] , 6返回true(它会检查3本身) 现在如果有两次相同的元素 ([1, 2, 3, 2]) 就会出现问题,并且 delete_if 会更改数组本身,因此您正在破坏数组... 感谢您向我指出 Uri。我希望我可以使用更少的代码来完成这项工作。【参考方案5】:

只需对其进行一次迭代并使用目标编号来查看它是否匹配。比这里的大多数答案快 100 倍

numbers = ( -10..10 ).to_a
numbers.unshift( numbers.first + -1 ) # if you do -20 or 20
numbers.push( numbers.last + 1 )
target    = 5
searched  =  
matches   =  
numbers.each do |number|
  if searched[ target - number + 1 ] == true
    matches[ "# number _plus_# target - number " ] = target
  end
  searched[ number + 1 ] = true
end
ap matches

【讨论】:

以上是关于检查数组中两个不同数字的总和是不是等于变量数?的主要内容,如果未能解决你的问题,请参考以下文章

数组中的两个不同数字,它们的和等于给定值

c_cpp 检查数组中是否存在两个元素,其总和等于数组其余部分的总和

找到所需的最小元素数,以使它们的总和等于或超过 S

如何获得二维数组中每一列和每一行的总和?

检测数组里是不是有两个数之和等于某个数

检查数字不是列表中 2 个整数的总和