路径打印——绘制路径中蕴含的目录结构
路径打印
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;
}请勿在正式提交时编写过多注释,否则会导致超时

