2012-10-28 57 views
0

我正在使用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] 

使用字符串是好的实际。

说明:哦,输出必须是数组中的整数,而不是它们的个别数字。

+0

为什么你不想使用字符串? –

+0

你想在列表中重新分配吗?所以如果你的号码是'2222',你的阵列是否有一个元素或4!? –

+0

@AmitKumarGupta,其实这是不切实际的,我现在更新我的功能,并没有问题。 – Annabelle

回答

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] 
+0

这很好,非常酷谢谢! – Annabelle

+0

你可以改变它没有重复,就像我有9433,它打印9433两次,而不是一次。 – Annabelle

+0

@Link - 是的。简单:)只需在最后添加一个对'uniq'的调用。请参阅编辑。 – Casper

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 
+0

我想到了这一点,但我需要实际上有整个数字,而不是数组中的个人数字。 – Annabelle

+0

好的,编辑包含加入的列表。 –

+0

真棒!谢谢! – Annabelle

相关问题