我正在解决一个问题,我必须获得数字数组列表的所有排列。唯一的限制是任何数字都不能以 0 开头,所以如果我们有 [0,1,2] 我们将获得
[1,2,0]
[1,0,2]
[2,0,1]
[2,1,0]
我知道如何用 3 个循环来做到这一点,但问题是我必须对不同大小的不同数字集重复这个,所以我需要一种方法可以应用于不同的数字集,但我不知道关于如何做到这一点。我想我必须使用某种递归函数,但我不知道如何实现它,所以数字不能以 0 开头。有什么想法吗?请不要只发布我想了解问题的代码,谢谢!
最佳答案
奇怪的问题!有趣的代码套路。
我天真地认为我会有一个递归方法:
- 调用者当前选择的项目列表
- 一组可供被调用者使用的项目
该方法将遍历该集合以再选择 1 个项目,并使用由该项目扩展的列表和由该项目缩减的集合调用自身。返回后,从列表中删除,添加回集合并继续下一个项目(当然是集合的防御副本)。
如果当前列表为空,则根据您的规则,所选的第一项不能为 0。如果您必须在某处收集排列(不仅仅是打印),则集合或观察者需要第三个参数。
当可用集合为空时,递归显然停止,此时排列被发送到集合或观察者。
如果项目可以重复,您可能会受益于首先对它们进行排序,以便跳过在给定位置再次选择相同的项目。
请注意,对于 N 个项目,这需要 N 个递归深度。但危险很小,因为即使 N=10000,它也可能不会发生计算溢出,但完成的 CPU 时间将是 order(N!)(可能是宇宙的尽头......)
关于java - ArrayList<Integer> 的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50077475/