java - ArrayList<Integer> 的排列

标签 java arraylist combinations permutation

我正在解决一个问题,我必须获得数字数组列表的所有排列。唯一的限制是任何数字都不能以 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/

相关文章:

java - 将数据从双数组传输到 HashMap

java - 如何通过 Intent 将新数据添加到数组列表

algorithm - 确定一个数字的可能组合的数量以获得指定的结果

java - 使用 Firefox Web 驱动程序启动 Selenium 时出现异常

java ee后台服务

java - 如何放置一个 ignoreCase

java - 如何使用findViewById获取ListView

java - 将 ArrayList 强制转换返回到 List 与不强制转换

C - 整数之间 2 个变量的组合 [ARRAY]

algorithm - 按字典顺序生成 k 组合