我正在研究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
感谢任何帮助。
答案 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]。这就是为什么您的代码只返回一个组合。