Ruby的阵列组合方法

时间:2014-12-30 00:43:10

标签: ruby arrays

我正在研究Ruby Monk的Ruby Primer上的问题。

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

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

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

而不是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"]

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

对于红宝石和尚问题,你需要的是Array.permutations。 Array.permutation(n)是一次取n个数组的可能排列数。 n = 1的[1,2,3]将为1,2,3 n = 2的[1,2,3]将是[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]。这就是为什么您的代码只返回一个组合。