2012-02-23 82 views
1

我在其中,我都有一个编号,需要 发现在该号码的位数每一种可能的排列问题的工作。例如,对于 示例,如果我给出20,则答案将是:2002。我知道 有n!可能的排列,我已经划分了 数字,以便每个数字是一个数组中的元素。我的问题是: 我如何遍历这个数组生成每一个可能的组合 一个数字,是至少2位长,但没有更多的 超过6生成所有独特的排列

+0

如果数字是'22',该怎么办? – ArjunShankar 2012-02-23 15:18:19

+0

对不起,我不太了解你的问题。如果你给一个数字20,那么答案将是:20,022,220,200,000,...... 22,222.26000000? – hqt 2012-02-23 15:19:41

+0

为了澄清,我说我想生成一组数字的每个可能的组合。如果给定的数字是1234,我需要生成1234,1243,1432,4213等,直到生成了所有可能的组合。 – gmaster 2012-02-23 15:25:40

回答

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并打印出清单,或者其他任何与它。

编辑:您还需要处理的permute边缘荷兰国际集团的情况下1位。

我认为这已经是'家庭作业'的太多信息:)

+0

你是什么意思“把preDigit放到'subPermutations'的每个元素中?”我不明白这将如何得到每一个可能的排列。 – gmaster 2012-02-23 15:42:01

+0

@gmaster - http://pastebin.com/5w7GE5iQ – ArjunShankar 2012-02-23 15:55:21

+0

前置意味着在开始时添加。我没有看到我如何在评论中解释这一点,我认为不值得将它放在答案中。因此请阅读上面的pastepin网址(该网址设置为1个月后过期) – ArjunShankar 2012-02-23 15:56:42

5

提示:

你会如何解决这个问题一位数字的问题?

现在,你会如何解决这个问题,因为你必须回答前一个问题,对于一个2位数?

+0

对于1位数字,您不必更改任何内容。我很抱歉,但我完全不知道你要做什么。我认为使用2 for循环,但是这不会产生每个可能的术语。 – gmaster 2012-02-23 15:22:33

+0

@gmaster:这是你的作业,所以我只给予提示。拿一支铅笔和纸。在上面写上任何一个数字。现在想想包含第一位数字的2位数字。现在写下第一个数字的副本,将第二个数字放在它旁边,并且您有一个排列。现在,您还可以如何将第二个数字放在第一个旁边作为另一个排列?当你在纸上计算出你的方法变成代码时。但是,直到你找到它,忘记你的过早的代码。 – 2012-02-23 15:25:41

+1

老实说,帮助作业,这是一个很好的和公平的提示:) – ArjunShankar 2012-02-23 15:57:51