zoukankan      html  css  js  c++  java
  • 华为机试题 火车进站

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

      

  • 相关阅读:
    单元测试的必要性
    【C++ STL】Queue
    【C++ STL】Stack
    【C++ STL】容器的选择
    【C++ STL】Map和Multimap
    [Effective JavaScript 笔记]第19条:熟练掌握高阶函数
    [Effective JavaScript 笔记]第18条:理解函数调用、方法调用及构造函数调用之间的不同
    node实现rar格式压缩
    [Effective JavaScript 笔记]第2章:变量作用域--个人总结
    [Effective JavaScript 笔记]第17条:间接调用eval函数优于直接调用
  • 原文地址:https://www.cnblogs.com/todayjust/p/5343147.html
Copyright © 2011-2022 走看看