考研机试 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。
输出描述
输出目录结构,每一个测试样例的输出紧跟一个空行。
题目链接
二.算法
题解
感觉这道题很迷,下面的代码能够通过自测输入中的样例,但是通过不了提交中的样例,但是对比的时候又说是完全一致的,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(); } }
努力,向上,自律