You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:29:36