Loading

考研机试 100.路径打印

 

时间:2021/03/14

 

一.题目描述

给你一串路径,譬如: a\b\c a\d\e b\cst d\ 你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录向右缩一格,就像这样: a   b     c   d      e b   cst d 同一级的需要按字母顺序排列,不能乱。

输入描述

每个测试案例第一行为一个正整数n(n<=10)表示有n个路径,当n为0时,测试结束,
接下来有n行,每行有一个字串表示一个路径,长度小于50。

输出描述

输出目录结构,每一个测试样例的输出紧跟一个空行。

题目链接

https://www.nowcoder.com/practice/64b472c9bed247b586859978d13145ad?tpId=40&tqId=21431&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

 

二.算法

题解

感觉这道题很迷,下面的代码能够通过自测输入中的样例,但是通过不了提交中的样例,但是对比的时候又说是完全一致的,emm。。。。。感觉思路是没有问题的,这里记录一下。首先要读入路径数n,然后对这些路径字符串进行排序,因为题目要求同一级的需要按照字母顺序排序。之后对每一个路径进行切割,因为在Java的正则表达式中,\\代表其他语言中的\,所以为了匹配\,这里使用\\\\,具体见博文:https://blog.csdn.net/Breezeg/article/details/106501649,切割完字符串后开始对切割完的字符串进行循环,若当前字符串与上一个相同位置的字符串相同则不进行输出,若不同则先输出一定的数量的空格后再输出。

代码

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;

public class Main{
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            //读取输入
            int n = in.nextInt();
            //String empyt = in.nextLine();
            //HashMap<String, Integer> map = new HashMap<>();
            //ArrayList<String[]> list = new ArrayList<>();
            if(n != 0){
                String[] path = new String[n];
                for(int i = 0; i < n; i++){
                    //String[] path = (in.next()).split("\\\\");
                    path[i] = in.next();
                }
                //对路径数组进行排序
                Arrays.sort(path);
                ArrayList<String[]> list = new ArrayList<>();
                for(int i = 0; i < n; i++){
                    String[] str = path[i].split("\\\\");
                    list.add(str);
                }
                String[] s = list.get(0);
                for(int i = 0; i < s.length; i++){
                    for(int j = 0; j < i; j++){
                        System.out.print("  ");
                    }
                    System.out.println(s[i]);
                }
                for(int i = 1; i < n; i++){
                    String[] s1 = list.get(i - 1);
                    String[] s2 = list.get(i);
                    for(int j = 0; j < s2.length; j++){
//                         System.out.println(j >= s1.length);
//                         System.out.println(s1[j] != s2[j]);
//                         System.out.println(s1[j]);
//                         System.out.println(s2[j]);
                        if(j >= s1.length || !s1[j].equals(s2[j])){
                            for(int k = 0; k < j; k++){
                                System.out.print("  ");
                            }
                            System.out.println(s2[j]);
                        }
                    }
                }
            }else{
                break;
            }
            System.out.println();
            //String empty = in.nextLine();
        }
        in.close();
    }
}

 

posted @ 2021-03-14 09:34    阅读(144)  评论(0编辑  收藏  举报