2013-11-15 14 views
0

我被采访了一个问题,之后我测试了我的代码,发现它错了。 不善于递归。但我无法弄清楚这个问题。给定长度的数组整数排列

问题是:给定一个从0〜9的数组范围,以及一个长度,例如3;生成给定长度的来自给定数组的所有整数排列 。 因此,例如: 排列应该是:012,013,014,...,345,346 ... 下面是我的java代码,问题在哪里? (我认为这是索引或偏移部分) 而且,如果有更好的解决方案!

public void NumPermutation(int[] list, int offset, int[] temp, int index){ 
    if(index == 4){ 
     printarray(temp); 
    } 

    for(int count = offset; count < list.length; count++){ 
     temp[index++] = list[count]; 
     int te = list[offset]; 
     list[offset] = list[count]; 
     list[count] = te; 
     NumPermutation(list, offset, temp, index); 
     index -= 1; 
    } 
} 

public void test(int len){ 
    int[] list = {0,1,2,3,4,5,6,7,8,9}; 
    int[] temp = new int[4]; 
    int index = 0, offset = 0; 
    NumPermutation(list, offset, temp,index); 
} 

的问题是,偏移每次可能增加,并且 它甚至不能达到结束的数量。

+0

“count”的声明在哪里? – chill

回答

1

您需要:

  • 通行证offset+1的递归调用。

  • 返回if语句。

  • 在递归调用后反转您的交换。

  • 替换4temp.length为更通用的解决方案。

  • 还优选地替换index++index,index -= 1indexindex + 1而没有。

这导致这样的代码:(取代printarray与标准印刷法,假设这是爪哇)

public static void NumPermutation(int[] list, int offset, int[] temp, int index){ 
    if(index == temp.length) { 
     System.out.println(Arrays.toString(temp)); 
     return; 
    } 

    for(int count = offset; count < list.length; count++){ 
     temp[index] = list[count]; 

     // swap 
     int te = list[offset]; 
     list[offset] = list[count]; 
     list[count] = te; 

     NumPermutation(list, offset + 1, temp, index + 1); 

     // reverse swap 
     te = list[offset]; 
     list[offset] = list[count]; 
     list[count] = te; 
    } 
} 

Live demo

+0

令人惊叹!谢谢! – JudyJiang

+0

但是我不明白为什么在最后换回swap? – JudyJiang

+0

@JudyJiang因为,如果你不这样做,你会在递归时弄乱元素的顺序。当你通过for循环运行时,你想获得所有不同的元素(否则你重复值),但是,由于顺序改变(并且不会改回),这不再保证。 (你可以检查出它会发生什么 - 它不断重复'0,1,2,X'和'0,1,9,X',而不是'0,1,3,X','0, 1,4,X'等)。 – Dukeling