【问题标题】:Ruby - Finding if any two numbers in an array if multiplied equal to a third numberRuby - 查找数组中是否有任何两个数字乘以等于第三个数字
【发布时间】:2015-03-22 19:47:52
【问题描述】:

我有一个有趣的问题。给定一个数组,我想知道该数组中是否有两个数字相乘等于第三个数字n

如果有,我会在控制台打印 true,如果没有,我会打印 false

例子

array = [4,7,9,13]
n = 63

这将返回 true,因为 9 * 7 = 63

def multiply_to (array, n)
  if array.any?(2){|a,b| a * b == n}
    puts "true"
  else
    puts "false"
  end
end

我是Ruby 的新手,但此代码不起作用。我哪里做错了。任何帮助表示赞赏。提前致谢

【问题讨论】:

  • 关于优化的注意事项:您可以首先通过检查 n % a == 0 创建一个可能候选数字的子数组,然后在子数组上运行您的算法。

标签: ruby arrays


【解决方案1】:

你可以写:

def multiply_to(array, n)
  array.combination(2).any? { |a,b| a * b == n }
end

array = [4,7,9,13]
n = 63
puts multiply_to array, n
# >> true

array = [4,7,91,13]
n = 63
puts multiply_to array, n
# >> false

#any? 不接受任何参数,但您将参数传递给它。所以你得到了有效的错误:

# `any?': wrong number of arguments (1 for 0) (ArgumentError)

【讨论】:

  • if else end,嗯?只是puts array.combination(2).any? { |a,b| a * b == n }
  • @RustamA.Gasanov 我有一段时间失明了。 :;)
【解决方案2】:

我想展示一个稍微复杂一点的版本

def multiply_to (array,n)
  numbers = array.map{|x|[x]}
  pairs = []

  for i in 0..numbers.length-1
    pairs.concat numbers[i].product(array - numbers[i])
  end

  puts "#{pairs.count{|a,b|a * b == n} > 0}"

end

在不提供 Ruby 功能的语言中,您需要做一些工作。

我们可以将我们的组合存储在一个名为pairs的数组中

我们想遍历数组中的每个数字。对于所有这些数字,我们希望得到一个数组与该元素的乘积以及该数组的所有其他数字。

这为我们提供了两个数字的所有组合。我们可以如下测试这个方法

multiply_to([4,7,9,13], 63)
=> true

【讨论】:

    【解决方案3】:

    我们得到一个数字数组arr 和一个目标产品n。你没有说arr 是否只包含整数,如果是,整数是否必须是非负数。部分基于您的示例,我将做出这两个假设,但可以修改该方法以处理对假设的一些更改。

    我会建议一个相对有效的解决方案。基准测试使用蛮力,最多需要n*n 乘法和比较。

    我相信以下所有操作在n 中都是线性的。

    首先,如果n = 0,我们要求arr至少包含两个元素,其中至少一个是零:

    (arr.size > 1 && arr.index(0)) if n.zero?
    

    如果n > 0n 是完美平方,我们要求它的平方根在arr 中至少出现两次:

    sqrt = f(n)
    arr.count(sqrt) > 1
    

    有非常快速的方法可以计算整数平方根,(或得出不存在的结论),例如Newton's Method

    接下来,创建一个包含 arr 的唯一元素的集合,这些元素是 n 的因子:

    require 'set'
    sarru = arr.each_with_object(Set.new) { |e,s| s << e if n%e == 0 }
    

    以及这些元素的数组:

    arru = sarru.to_a
    

    最后,遍历arru 并检查集合sarru 是否包含互补因子n/e(非常快):

    factor = arru.find { |e| sarru.include?(n/e) }
    

    然后我们返回:

    factor ? [factor, n/factor] : nil
    

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      相关资源
      最近更新 更多