我正在解决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]。这就是您的代码只返回一个组合的原因。