java模擬全排列按序輸出所有可能的結果

0前言

今天在線筆試遇見了一個很有意思的編程題,特此整理記錄如下:

1.問題描述

問題描述(大概意思是)
給出一組整數(整數範圍是1-9,數據不重複),要求按升序輸出所有的排序可能性

輸入:首先輸入一個n表示數據個數,然後是n個整數
輸出:按升序一次輸出每一種結果

例如:

輸入 :
3
1 5 9

輸出
159
195
519
591
915
951

2.問題分析

根據題意不難將問題分解成:

1.找出所有的排序可能性
2.將所有的結果進行排序

2.1 找出所有的排序可能性

所有的排序可能性,即模擬全排列
根據已知知識點,可知所有可能性的個數爲:

全排列個數

問題的關鍵點就在於,如何模擬出所有的可能性

首先,拿例子1 5 9來說

159
195

第一個位置與第一個位置交換,然後保持第一個位置不變,第二個位置與第三個位置交換

519
591

第二個位置與第一個位置交換,然後保持第一個位置不變, 第二個位置與第三個位置交換

915
951

第三個位置與第一個位置交換,然後保持第一個位置不變, 第二個位置與第三個位置交換

如果n個元素,就是n組,每組再遞歸處理

結論:
全排列就是從第一個元素起分別與它後面的元素交換所形成的集體

2.2排序

因爲已知整數範圍爲1-9,則可以將所有的整數拼接成一個字符串,然後按照字符串排序即可

3.代碼實現

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @Title:Main.java 
 * @author Stone6762  
 * @CreationTime 2018年6月11日 下午9:25:46
 * @Description:
 */
public class Main {

    /** @list存儲全排列的所有可能性
     */
    public static List<String> list;

    public static void permutation(int[] array, int index) {

        if (index > array.length) {
            return;
        }

        if (index == array.length) { 
            StringBuilder b = new StringBuilder();
            for (int i = 0; i < array.length; i++) {
                b.append("" + array[i]);
            }
            list.add(b.toString());
        }
        for (int i = index; i < array.length; i++) {
            swap(array, index, i);
            permutation(array, index + 1);
            swap(array, index, i); // 再次交換,保持原狀
        }

    }

    private static void swap(int[] array, int index, int target) {
        int tmp = array[index];
        array[index] = array[target];
        array[target] = tmp;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();
            int array[] = new int[n];
            for (int i = 0; i < array.length; i++) {
                array[i] = scan.nextInt();
            }
            list = new ArrayList<String>();
            permutation(array, 0);

            Collections.sort(list);

            for (String str : list) {
                System.out.println(str);
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章