【问题标题】:Generate all unique permutations生成所有唯一排列
【发布时间】:2012-03-14 00:20:37
【问题描述】:

我正在处理一个问题,我得到了一个数字并且需要 找到该数字中所有可能的数字排列。为了 例如,如果给我20,答案将是:2002。我知道 有n! 可能的排列,我已经划分了 数字,以便每个数字都是数组中的一个元素。我的问题是: 我怎样才能遍历这个数组来生成每一个可能的 长度至少为 2 位但不超过 2 位的数字的组合 超过 6 个。

【问题讨论】:

  • 对不起,我不太明白你的问题。如果您给出数字 20,那么答案将是:20,02,220,200,000,....222222,000000?
  • 澄清一下,我是说我想生成一组数字的所有可能组合。如果给定的数字是 1234,我需要生成 1234、1243、1432、4213 等,直到生成所有可能的组合。
  • 我假设您想忽略重复项,例如222 可以是 1 或 6 种相同的组合。

标签: java arrays sorting


【解决方案1】:

提示:

对于一个 1 位数字,您将如何解决这个问题?

现在,如果你已经回答了上一个问题,你将如何解决这个问题,对于一个 2 位数字?

【讨论】:

  • 对于 1 位数字,您无需更改任何内容。对不起,我完全不知道你要做什么。我认为使用 2 个 for 循环,但这不会生成所有可能的术语。
  • @gmaster:这是你的作业,所以我只是给出提示。准备一支铅笔和一张纸。在上面写上任何一位数。现在考虑一个包含第一位数字的 2 位数字。现在写下第一个数字的副本,将第二个数字放在它旁边,你就有了一个排列。现在,你怎么能把第二个数字放在第一个旁边进行另一个排列?当您在纸上弄清楚时,将您的方法转化为代码。但在你弄清楚之前,忘记你的过早代码。
  • 老实说,对于家庭作业的帮助,这是一个很好且公平的提示:)
  • @gmaster 他正在尝试帮助您进行递归,还有另一个提示。
【解决方案2】:

假设n 单个数字位于长度为n 的数组中。那么生成排列的问题归结为:

  1. 选择n 中的一个数字作为要打印的第一个数字。
  2. 置换剩余的n-1 数字。

递归。

这种递归函数permute 的伪代码类似于:

List permute (Array digits)
{
  List permutations = /* initialize an empty list */

  for (i=0; i<n; i++)
    {
      firstDigit = digit[i];
      Array otherDigits = /* array containing all digits except firstDigit.  */
      List subPermutations = permute(otherDigits);
      /* prepend firstDigit into each element of 'subPermutations' */
      /* add all elements of 'subPermutations' to the list 'permutations' */
    }
  return permutations;
}

然后只需调用permute 并打印出列表,或对其进行任何其他操作。

编辑:您还需要处理 permuteing 1 位数的边缘情况。

我认为这对于“家庭作业”来说已经太多信息了:)

【讨论】:

  • 你是什么意思“在'subPermutations'的每个元素中添加firstDigit”?我不明白这将如何得到所有可能的排列。
  • prepend 表示在开头添加。我没有看到如何在评论中解释这一点,我认为不值得将它放在答案中。所以请阅读上面的粘贴 URL(设置为 1 个月后过期)
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2019-03-26
  • 2020-02-18
相关资源
最近更新 更多