路径打印——绘制路径中蕴含的目录结构
路径打印
https://www.nowcoder.com/practice/64b472c9bed247b586859978d13145ad?tpId=62&tqId=29457&tPage=1&ru=%2Fkaoyan%2Fretest%2F2002&qru=%2Fta%2Fsju-kaoyan%2Fquestion-ranking&tab=answerKey
题目描述
给你一串路径,譬如: 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。
输出描述
输出目录结构,每一个测试样例的输出紧跟一个空行。
- C++ STL(标准模板库)
- 是一套C++模板类,提供通用的模板类和函数
- 容器-Containers:用于管理某一类对象的集合
- 算法-Algorithms:作用于容器,提供了执行各种操作的方式
- 迭代器-Iterators:用于遍历对象集合的元素
- 向量 Vector:能够存放任意类型的动态数组
- 1.顺序序列:元素按线性顺序排序;可通过元素在序列中的位置访问对应的元素
- 2.动态数组:对序列中任意元素进行快速直接访问;提供在序列末尾相对快速地添加/删除元素
C++中两种输入输出方式:
cin、cout;效率低;因为输出时将内容先放入缓冲区再输出
使用ios::sync_with_stdio(false);使内容不在缓存直接输出
scanf、printf;尽量多使用
#include<iostream> #include<string> #include<vector> #include<algorithm> //最多max个路径 #define MAX 10 using namespace std; int main(){ //加速cin、cout ios::sync_with_stdio(false); int n; //当输入测试案例为0时结束测试 while(cin >> n && n != 0){ //定义string类型的数组;每个元素为一条字符串路径 vector<string> path[MAX]; //处理完一个测试案例中的每一个路径 for(int i=0; i<n; i++){ string str;//接收每一条路径 cin >> str; string temp;//做中间变量 int j=0; while(j < str.size()){ //处理反斜杠,不将其存入path字符串数组中 if(str[j]=='\\'){//'\\'表示转义字符反斜杠\ j++; continue;//不执行下面的语句,直接执行while j的判断 } //以反斜杠为界,两反斜杠之间的处理为一个字符串,即一个目录名;如cst作为path二维数组中的一个元素,而并非将其字母拆开 while(str[j]!='\\' && j<str.size()) temp += str[j++];//直接做字符串的拼接 path[i].push_back(temp);//在path[i]数组最后添加一个数据;此处即path[i]内存放temp temp.clear();//清空 } } //排序;按字母顺序排序 sort(path, path+n);//将path[0]~path[n-1]元素排序 //进行输出 for(int i=0; i<n; i++){ int index = 0; string space;//未初始化的string类型变量其内为空,什么也没有 while(i != 0 && index<path[i].size() && index<path[i-1].size() && path[i][index]==path[i-1][index]){ //处理相邻两个路径根目录一致时,仅输出一个根目录 index++; space += " "; } for(; index<path[i].size(); index++, space += " ") cout << space << path[i][index] << ""; } cout << "\n"; } return 0; }
请勿在正式提交时编写过多注释,否则会导致超时