描述:给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列
输入: |
有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。 |
输出: |
输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。 |
样例输入: |
3 1 2 3 |
样例输出: |
1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 |
思路:先对输入序列进行字典排序,然后再判断每个序列是否符合火车进出站的出栈序列。一定要按照要求输出,多空格是要跪的,别问我怎么知道的...
import java.util.Scanner; public class Main { public static boolean judge(int a[], int n) {// 从头开始,判断其后比他小的元素是否为降序,若不是,则不是正确的出栈序列,,若遇到比他大的数,则把它当做标记 int tag = a[0]; int p = a[0]; int i = 1; for (i = 1; i < n; i++) { if (a[i] > tag) { tag = a[i]; p=tag; } else if (a[i] < p) { p = a[i]; } else { break; } } if (i == n) { return true; } else { return false; } } public static int[] reverse(int[] a, int l, int r) { int t; while (l < r) { t = a[l]; a[l] = a[r]; a[r] = t; l++; r--; } return a; } public static void printZidianxu(int[] a, int n) { int p = 0; int temp; while (true) { int flag = 0; for (int i = n - 1; i >= 0; i--) { if (i - 1 < 0) break; if (a[i] > a[i - 1]) { p = i - 1; while (i < n && a[p] < a[i]) { i++; } int minmax = i < n ? i - 1 : n - 1; temp = a[minmax]; a[minmax] = a[p]; a[p] = temp; a = reverse(a, p + 1, n - 1); if (judge(a, n)) {//满足火车入栈出栈的顺序 输出 for (int k = 0; k < n-1; k++) { System.out.print(a[k] + " "); } System.out.print(a[n-1]); System.out.println(); } flag = 1; break; } } if (flag == 0) { break; } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = 0; while (sc.hasNext()) { n = sc.nextInt(); int arr[] = new int[n]; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } for (int k = 0; k < n-1; k++) { System.out.print(arr[k]+" "); } System.out.print(arr[n-1]); System.out.println(); printZidianxu(arr, n); } } }