生成给定数字的数字的所有排列?

时间:2012-10-28 02:06:51

标签: ruby permutation

我正在使用Ruby并且需要以某种方式生成给定数字中的数字的所有排列并将它们存储在数组中。因此,例如我有数字n = 9431,我需要生成所有可能的方法,您可以订购这四个数字并将它们存储在一个数组中(原始数据可以在数组中)。

因此,如果我输入9431,我需要使用以下内容获取数组:

[9413, 9431, 9143, 9134, 9314, 9341, 4913, 4931, 4193, 4139, 4319, 4391, 1493, 1439, 1943, 1934, 1394, 1349, 3419, 3491, 3149, 3194, 3914, 3941]

实际上使用字符串很好。

澄清:哦,输出必须是数组中的整数,而不是它们各自的数字。

2 个答案:

答案 0 :(得分:2)

这是“作弊”,因为它使用了你不想做的中间字符串,但它有效:

9431.to_s.chars.to_a.permutation.map(&:join).map(&:to_i).uniq
=> [9431, 9413, 9341, 9314, 9143, 9134, 4931, 4913, 4391, 4319, 4193, 
    4139, 3941, 3914, 3491, 3419, 3194, 3149, 1943, 1934, 1493, 1439, 
    1394, 1349]

答案 1 :(得分:1)

你可以使用除法和/或模数迭代10来得到各个数字作为列表。

您可以使用列表排列来获得不同的排列,例如:

irb(main):015:0> elts = [9,4,3,1].permutation.to_a
=> [[9, 4, 3, 1], [9, 4, 1, 3], [9, 3, 4, 1], [9, 3, 1, 4], [9, 1, 4, 3], [9, 1, 3, 4], [4, 9, 3, 1], [4, 9, 1, 3], [4, 3, 9, 1], [4, 3, 1, 9], [4, 1, 9, 3], [4, 1, 3, 9], [3, 9, 4, 1], [3, 9, 1, 4], [3, 4, 9, 1], [3, 4, 1, 9], [3, 1, 9, 4], [3, 1, 4, 9], [1, 9, 4, 3], [1, 9, 3, 4], [1, 4, 9, 3], [1, 4, 3, 9], [1, 3, 9, 4], [1, 3, 4, 9]]
irb(main):016:0> elts.each{ |x| puts x.join }
9431
9413
9341
9314
9143
9134
4931
4913
4391
4319
4193
4139
3941
3914
3491
3419
3194
3149
1943
1934
1493
1439
1394
1349