某廠實習生筆試題-數組全排列

題目描述

輸入一個數組,以空格隔開,要求按一下順序輸出其全排列。

樣例:

輸入:

1 2 3

輸出:

123 132 213 231 312 321

備註:輸入和輸出都是自然數數組。

程序設計

毫無疑問,這道題我首先想到的是運用遞歸來解決。

對於輸入的一個數組n,其排列方式可看作是在n個位置,從第一個位置開始,到最後一個位置,放置所輸入的n個數。

假設我們先將輸入的n個數放在一個箱子裏。

對第 step (0 ≤ step <n)個位置,我們可以選擇除了前面 step 個數以外的 step - i 個數中的一個(即箱子裏剩下的下一個(按輸入順序))來放置。

當 step = n 時,說明n個位置均已放置好對應的數,作爲一種排列方式輸出。

這時,再返回上一層遞歸,返回之後要將剛剛放置在n - 1這個位置的數,放回箱子裏。

即step = n - 1時,即最後一個位置,箱子裏只有一個數可以放,同理再返回上一層遞歸。

返回之後要將剛剛放置在n - 2的位置的數放回箱子裏。

即step = n - 2時,即倒數第二個位置,箱子裏只有兩個數可以放…

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static int n = 0;
    public static int[] array;
    public static int[] array2;//裝數字的箱子
    public static boolean[] array3;//記錄箱子中對應的數字是否已經被取出

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num;
        ArrayList<Integer> arrayList = new ArrayList<>();
        while(scanner.hasNext()){
            num = scanner.nextInt();
            arrayList.add(num);
            n++;
        }
        int i=0;
        array = new int[n];
        array2 = new int[n];
        array3 = new boolean[n];
        for ( Integer each:arrayList) {
            array[i++] = each;
        }
        for (int j = 0; j < n; j++) {
            array3[j] = true;
        }
        fullPermutation(0);
    }
    public static void fullPermutation(int step){
        if (step == n)
        {
            for (int j = 0; j < n; j++) {
                System.out.print(array2[j]);
            }
            System.out.print(" ");
            return;
        }
        for (int i = 0; i < n; i++) {
            if (array3[i]){
                array2[step] = array[i];
                array3[i] = false;//該數已從箱子裏取出
                fullPermutation(step + 1);
                array3[i] = true;//放回該數至箱子
            }
        }
        return;
    }
}

遞歸的思路,我用語言描述起來比較繞,大家可以將提供的樣例,代入到程序跑一遍,便會有更清晰的認識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章