路径打印——绘制路径中蕴含的目录结构

路径打印

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;
}

请勿在正式提交时编写过多注释,否则会导致超时

全部评论

相关推荐

16 1 评论
分享
牛客网
牛客企业服务