ArrayList <integer>的排列

时间:2018-04-28 14:15:45

标签: java arraylist combinations permutation

我正在处理一个问题,我必须获得数字arylylist的所有排列。唯一的限制是任何数字都不能以0开头,所以如果我们有[0,1,2]我们就会得到

[1,2,0]

[1,0,2]

[2,0,1]

[2,1,0]

我知道如何用3个循环来做这个,但事实是我必须重复这个到不同大小的不同数字组,所以我需要一种方法,我可以应用于不同的数字集但我不知道关于如何做到这一点。我想我必须使用某种递归函数但我不知道如何实现它所以数字不能从0开始。任何想法?请不要发布我想了解问题的代码,谢谢你的优势!!

2 个答案:

答案 0 :(得分:1)

好奇的问题!有趣的代码kata。

我天真地认为我会有一个递归方法:

  • 来电者当前选择的项目列表
  • 可用于被叫方的一组项目

该方法将迭代该集合以选择另外1个项目并使用此项目扩展的列表调用自身,并且该项目减少该集合。返回后,从列表中删除,添加回设置并继续下一个项目(获取该套课程的防御性副本)。

如果当前列表为空,则根据您的规则,所选的第一项不能为0。如果你必须在某处收集排列(不仅仅是打印),那么集合或观察者需要第三个参数。

当可用集为空时,递归显示停止,此时置换将发送到集合或观察者。

如果项目可以重复,您可以先从排序中获益,以便跳过在给定位置再次选择同一项目。

请注意,对于N个项,请求N的递归深度。但危险很小,因为即使N = 10000,它也可能不会堆栈溢出,但CPU完成的时间将是顺序(N!)(可能是宇宙结束......)

答案 1 :(得分:0)

您可以按照此处所述递归解决此问题:Permutation of an ArrayList of numbers using recursion。 唯一缺少的就是你对零的限制,可以这样解决(循环取自上面的例子):

for (List<Integer> al : myLists) {

    // The part you need to add:
    if (al.get(0) == 0) {
        continue;
    }

    String appender = "";
    for (Integer i : al) {
        System.out.print(appender + i);
        appender = " ";
    }
    System.out.println();
}

您基本上检查每个排列的第一个元素,并跳过前导零的元素。 continue跳转到循环的下一次迭代,因此跳转到下一个排列。