• 华为机试题 火车进站


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

      

  • 相关阅读:
    程序员的数学基础课
    程序员的数学基础课
    Ruby 自学记录 7
    今日新闻整理 2020-7-22
    github of Ruby developers
    Ruby 自学记录 6 create a new controller action and view
    Ruby 自学记录 5 Using RubyMine that I quickly create Rails project
    Kafka基础(十三): 基本面试题(三)
    Hadoop基础(五十六):MapReduce 过程详解 (用WordCount作为例子)
    Hive面试题(2):Hive 执行过程实例分析
  • 原文地址:https://www.cnblogs.com/todayjust/p/5343147.html
Copyright © 2020-2023  润新知