Ruby 的数组组合方法



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

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

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

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

任何帮助,不胜感激。

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

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"]
您可以使用

Array#permutation获取字符数组的排列:

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

对于红宝石僧侣的问题,你需要的是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.comb(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]。这就是您的代码只返回一个组合的原因。

最新更新