【问题标题】:Ruby's Array Combination MethodRuby的数组组合方法
【发布时间】:2014-12-30 00:43:10
【问题描述】:

我正在解决关于 Ruby Monk 的 Ruby Primer 的问题。

问题陈述 给定一个具有不同数字的 3 或 4 位数字,返回可以由这些数字组成的所有唯一数字的排序数组。 例子: 给定:123 返回:[123、132、213、231、312、321]

我认为 Array#combination 方法可以解决问题。我的代码如下所示:

def number_shuffle(number)
  # take integer and turn it into an array of digits
  digits = Array.new

  number.to_s.split('').each do |element|
    digits << element.to_i
  end

  # shuffle the elements
  return digits.combination(digits.length).to_a
end

puts number_shuffle(123)

但是上面的代码返回:

1
2
3

不知道我在这里做错了什么。我认为文档说得很清楚:

http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-combination

感谢任何帮助。

【问题讨论】:

  • 对于number = 123,计算[1,2,3].combination(3).to_a =&gt; [[1,2,3]]puts [[1,2,3]] 将在连续的行上打印123。相比之下,p [[1,2,3]] 在一行上打印[[1, 2, 3]]。你得到这个结果是因为每个数组a 只有一个大小组合a.size,即a,所以返回[a]。另一方面,[1,2,3].combination(1).to_a =&gt; [[1], [2], [3]][1,2,3].combination(2) =&gt; [[1, 2], [1, 3], [2, 3]]。我相信您知道您需要使用permutation 而不是combination

标签: ruby arrays


【解决方案1】:

你想要Array#permutation,而不是Array#combination

number = 123
number.to_s.split('').permutation.map(&:join).uniq.sort
# => ["123", "132", "213", "231", "312", "321"]

number = 122
number.to_s.split('').permutation.map(&:join).uniq.sort
# => ["122", "212", "221"]

【讨论】:

  • 谢谢大家,但现在我不明白组合方法的作用。
  • mathsisfun.com/combinatorics/combinations-permutations.html。另外,在选择解决方案的时候,number = 122的结果应该是什么?
  • 了解combinationspermuations 之间区别的最佳方法是对数组进行双向评估,看看你得到了什么:[1,2,3].combination(2).to_a =&gt; [[1, 2], [1, 3], [2, 3]][1,2,3].permutation(2).to_a =&gt; [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]。您会看到[1, 2] 的组合有两个排列[1, 2][2, 1]。对于 [1,2,4][1,2,3,4].combination(3).to_a 的组合,有六个 (3x2) 排列:[1,2,4][1,4,2][2,1,4][2,4,1][4,1,2][4,2,1]
  • @CarySwoveland,我从数学的角度理解你的意思,但我原帖中的代码返回 1、2、3,根本没有组合。那里仍然缺少一些东西。
  • @user245185 [1,2,3].combination(3).to_a # =&gt; [[1, 2, 3]]。将此与[1,2,3].combination(2).to_a # =&gt; [[1, 2], [1, 3], [2, 3]] 进行比较。在第一种情况下,只有一个组合长度为 3 个元素。在第二种情况下,有 3 个组合,长度为 2 个元素。
【解决方案2】:

您可以使用Array#permutation获取字符数组的排列:

def number_shuffle(number)
  number.to_s.chars.permutation.map { |x| x.join.to_i }.sort
end

【讨论】:

    【解决方案3】:

    对于 ruby​​ 僧侣问题,您需要的是 Array.permutations。 Array.permutation(n) 是一次取 n 的数组的可能排列数。 [1,2,3] n = 1 将是 1, 2, 3 [1,2,3] 与 n = 2 将是 [1,2] [2,1] [1,3] [3,1] [2,3] [3,2]

    你需要的是

       Array.permutations(Array.length)
    

    Array.combination(n) 返回从数组中取出 n 个对象时可以从数组中进行的唯一选择的数量。

    对于数组 [1,2,3] 如果 n = 1。一次只能取出一个元素 可能的选择是 1 ,2 和 3。

    对于数组 [1,2,3] 如果 n= 2。您可以一次取出两个元素。 可能的选择是 [1,2] 、 [1,3] 和 [2,3]

    您已将数组的长度指定为 N (N = Array.Length)

    所以在 [1,2,3] 的情况下,如果 n = 3,只有一种方法可以使 使用所有元素进行选择。 那是[1,2,3]。这就是为什么您的代码只返回一个组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多