描述:给定一个正整数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);
}
}
}