zoukankan      html  css  js  c++  java
  • [Jobdu] 题目1090:路径打印

    题目描述:

    给你一串路径,譬如:
    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。

    输出:

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

    样例输入:
    4
    a\b\c
    a\d\e
    b\cst
    d\
    0
    样例输出:
    a
      b
        c
      d
        e
    b
      cst
    d
    
    
    先帖代码如下:

    #include <iostream>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    bool comp(string a,string b){
        int l = a.length()>b.length()?b.length():a.length();
        for(int i=0;i<l;i++){
            if(a[i]!=b[i]){
                if(a[i]!='\\'&&b[i]!='\\'){
                    return a[i]<b[i];
                }
                else if(a[i]=='\\'){
                    return true;
                }
                else if(b[i]=='\\'){
                    return false;
                }
            }
        }
        return a.length()<b.length();
    }
    
    int main(int argc,char* argv[]){
        //freopen("input.txt","r",stdin);
        int n;
        string str;
        vector<string> v;
        while(cin>>n&&n){
            v.resize(0);
            while(n--){
                cin>>str;
                //cout<<str<<endl;
                if(str[str.length()-1]=='\\'){
                    str.erase(str.length()-1,str.length());
                }
                if(find(v.begin(),v.end(),str)==v.end()){
                    v.push_back(str);
                }
                while(str.find('\\')!=string::npos){
                    str.erase(str.find_last_of('\\'),str.length());
                    if(find(v.begin(),v.end(),str)==v.end()){
                        v.push_back(str);
                    }
                }
            }
            sort(v.begin(),v.end(),comp);
            for(int i=0;i<v.size();i++){
                if(v[i].find('\\')==string::npos){
                    cout<<v[i]<<endl;
                }
                else{
                    for(int j=0;j<v[i].find_last_of('\\');j++){
                        cout<<" ";
                    }
                    cout<<" ";
                    cout<<v[i].substr(v[i].find_last_of('\\')+1,v[i].length());
                    cout<<endl;
                }
            }
            cout<<endl;
        }
        return 0;
    }
    

    这道题目卡了很久。一直PE,原来题目中的输出要求指的是 子目录比父目录向右缩一格
    指的是 子节点的缩进长度 =父亲节点的缩进 +父亲节点本身字符串长度+1.

    懒得写注释了,程序的思想是把所有的文件提取出来,存在一个vector里,对其按要求排序输出即可。

    比如说样例中的:

     a\b\c

     a\d\e

     b\cst

     d\

    首先从这些目录中提取出所有的文件(包含路径),得到:

     a、a\b、a\b\c、a\d、a\d\e、b、b\cst、d,

    然后要做的就是排序了,过程很简单,在自定义的comp函数中实现。

    在这儿排序后的结果应该跟上面一样。

    最后输出,输出的时候把文件路径的部分隐掉,至于空格的数量看题目的要求了。这儿最蛋疼了,一直没搞清楚题意,害我PE了10几次。

    这题也可以用字典树吧,感觉还是这个实现起来简单一点。



  • 相关阅读:
    XCode Playground Overview
    Swift开发学习(二):Playground
    swift网址
    swift关于is和as的解释
    Swift之 ? 和 !
    Swift 学习之二十一:?和 !(详解)
    Swift学习三
    Makefile project
    20171110面试笔记 服务器端程序员+C/C++开发
    关键字
  • 原文地址:https://www.cnblogs.com/easonliu/p/2642321.html
Copyright © 2011-2022 走看看