【问题标题】:Generate all permutations of the digits of a given number?生成给定数字的所有数字排列?
【发布时间】:2012-10-28 02:06:50
【问题描述】:

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

实际上使用字符串很好。

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

【问题讨论】:

  • 你为什么不想使用字符串?
  • 你想在你的列表中重复吗?因此,如果您的号码是 2222,您的数组应该有一个元素还是 4 个元素!?
  • @AmitKumarGupta,其实以前是不切实际的,我现在更新了我的函数,没问题。
  • @AmitKumarGupta,没有重复,所以你不能制作 4444,它必须使用所有数字,只需重新排序。看看 casper 的回答。
  • 我的问题是,如果输入的数字已经有重复怎么办?尝试使用 4444 而不是 9431 作为输入的 Casper 的答案。它能给你想要的答案吗?

标签: ruby permutation


【解决方案1】:

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

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]

【讨论】:

  • 你能不能把它改成不重复,就像我有 94​​33,它会打印两次 9433 而不是一次。
  • @Link - 是的。简单:) 只需在最后添加对uniq 的呼叫。见编辑。
  • 通常你需要repeated_permutation 来查看重复,这使得uniq 不必要,但是一个数字很容易有重复的数字,这会导致输出重复
【解决方案2】:

您可以迭代,使用除法和/或模数除以 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

【讨论】:

  • 我想到了这一点,但我实际上需要的是整数,而不是数组中的单个数字。
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
相关资源
最近更新 更多