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);
}
}
}
}