배열의 전체 순열 찾기 -Java

全排列르는 무엇입니까 ?

이 부분은 Baidu 백과 사전에서 가져온 것입니다.

n 개의 다른 요소에서 m (m≤n) 요소를 가져 와서 특정 순서로 배열합니다.이를 n 개의 다른 요소에서 m 개의 요소를 취하는 배열이라고합니다. m = n이면 모든 순열을 완전 순열이라고합니다.

정신 여행

수학 排列组合의 개념 에 따르면 전체 배열을 만드는 방법은 무엇입니까?

String [] { "Dongting Lake", "Poyang Lake", "Taihu Lake", "Hongze Lake"} 배열이 있다고 가정합니다.

이제 새 4 개 요소 배열 Array [4]를 입력해야합니다. 아래 단계를 수행 할 수 있습니다.

  • 계속해서 Array [0]에 배치하면 네 가지 선택 사항이 있습니다.
  • Array [1]로 가서 다시 배치하면 세 가지 선택이 있습니다.
  • Array [2]로 가서 다시 배치하면 두 가지 선택이 있습니다.
  • Array [3]로 이동하여 다시 배치하면 선택이 있습니다.

프로그래밍 언어로 전환 하시겠습니까?

  • Array [0]에는 4 가지 선택 항목이 있으므로 for 루프를 사용하여 4 가지 선택 항목을 모두 나열해야합니다.
  • Array [0]이 선택을했을 때 (하나의 for 루프) Array [1]은 선택할 수있는 요소가 세 개 남았으며 for 루프를 계속 사용하여 세 가지 선택 항목을 모두 나열합니다.
  • Array [1]이 선택 (for 루프)을 수행하면 Array [2]에는 선택할 수있는 두 개의 요소가 남아 있습니다. for 루프를 계속 사용하여 두 선택 항목을 모두 나열합니다.
  • Array [2]가 선택 (for 루프)을 수행하면 Array [3]에는 선택할 수있는 요소가 하나 남아 있습니다. for 루프를 계속 사용하여 모든 선택 항목을 나열합니다.

위의 붙여 넣기와 복사의 효과 같은 느낌인가요?이 느낌을 기억 해주세요.이 느낌이 나타나면 반복적으로 문제를 해결할 수 있습니다.

코드 예

递归핵심이고 코드가 주석 처리되어 있습니다.

public class FourLakes {
    
    

    public static void main(String[] args) throws InterruptedException {
    
    
        //待放置元素的数组
        String[] out = new String[4];
        //待计算排列组合的数组
        String[] lakes = new String[]{
    
    "洞庭湖", "鄱阳湖", "太湖", "洪泽湖"};
        //放置元素的索引从0开始
        calc(out, 0, lakes);
    }

    /**
     * 你可能惊讶于代码如此简洁
     * 本宝宝花费了一下午的时间想出来的
     * 会不会笨了点。。。。。。。。。
     * @param out 待放置元素的数组
     * @param outIndex 当前要放置元素的位置
     * @param data 待拿取元素的数组
     */
    private static void calc(String[] out, int outIndex, String[] data) {
    
    
        //递归退出的条件
        //当放置元素的索引大于放置数组长度后,退出
        if (outIndex >= out.length) {
    
    
            System.out.println(Arrays.toString(out));
            return;
        }
        //声明一个缓存数组用,
        //作用是:当从 data 中取完元素后,将剩余元素copy 到其中,因为已经取出了一个元素,所以缓存数组大小要-1
        String[] temp = new String[data.length-1];

        //此处循环的意思就是,data 数组有几个元素就有几种取法
        for (int i = 0; i < data.length; i++) {
    
    
            //取元素,放置到指定的位置
            out[outIndex] = data[i];
            //从取元素的位置向前看,看看是不是有剩余的元素,然后拷贝到缓存数组中
            System.arraycopy(data, 0, temp, 0, i);

            //从取元素的位置向后看,看看是不是有剩余的元素,然后拷贝到缓存数组中
            System.arraycopy(data, i + 1, temp, i, temp.length - i);

            //放置数组不变,将要元素的放置位置+1,将缓存数组作为新的 data
            //递归执行
            calc(out, outIndex + 1, temp);
        }
    }
}

추천

출처blog.csdn.net/lijie2664989/article/details/107037475