Java如何枚举数组中任意两元素交换后的所有可能数组?
实现Java枚举数组所有两两交换后的可能数组
嘿,这个需求其实很好实现,核心就是遍历所有不重复的元素对,每次复制原数组后交换对应位置的元素,最后输出结果就行。咱们直接上代码和解释:
思路梳理
要避免重复枚举(比如交换索引0和1,跟交换1和0是同一个结果),我们只需要遍历所有满足 i < j 的索引组合——这样正好是 n*(n-1)/2 种情况(n是数组长度),对应你案例里的5*4/2=10种,完美匹配需求。
另外要注意:数组是引用类型,每次交换必须基于原数组的副本操作,不然修改原数组会影响后续的交换结果。
完整代码实现
import java.util.Arrays; public class SwapEnumeration { public static void main(String[] args) { // 原数组 int[] sol = new int[]{3, 5, 1, 2, 4}; int n = sol.length; System.out.println("所有两两交换后的数组:"); // 遍历所有i < j的索引对 for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { // 复制原数组,避免修改原数组 int[] swappedArr = Arrays.copyOf(sol, n); // 交换i和j位置的元素 int temp = swappedArr[i]; swappedArr[i] = swappedArr[j]; swappedArr[j] = temp; // 输出结果数组 System.out.println(Arrays.toString(swappedArr)); } } } }
代码关键点解释
Arrays.copyOf(sol, n):快速复制原数组生成新数组,保证每次交换都是独立的,不会干扰原数组和其他交换结果。- 双重循环的边界:外层
i从0到n-2(因为j要比i大,所以i最多到倒数第二个元素),内层j从i+1到n-1,确保每对元素只交换一次,没有重复。 Arrays.toString(swappedArr):把数组转换成友好的字符串格式输出,方便查看结果。
运行结果
运行这段代码后,会输出10个不同的数组,正好对应所有两两交换的可能,比如:
[5, 3, 1, 2, 4](交换0和1)
[1, 5, 3, 2, 4](交换0和2)
[2, 5, 1, 3, 4](交换0和3,就是你例子里的结果)
... 剩下的7种也会依次输出
内容的提问来源于stack exchange,提问作者skatomundo
相关产品推荐
相关产品推荐

