路径打印(set以及字符串的相关操作)

题目链接

题目描述

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

输出描述:

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

输入

复制

4
a\b\c
a\d\e
b\cst
d\
0

输出

复制

a
b
c
d
e
b
cst
d

题目分析:并没有很好的思路,参考了如下代码

#include"stdio.h"
#include<iostream>
#include<string>
#include<set>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long ll;
const int maxn=;
int n;
set<string>ss;
string s; void func(){
for(int i=;i<s.length();i++)
if(s[i]=='\\'){ ss.insert(s.substr(,i));//用\分割字符串,并投入一个set,set是不允许重复而且自动排序的
} }
int main(){ // freopen("c://jin.txt","r",stdin);
while(cin>>n){
if(n==)break;
ss.clear();
for(int i=;i<n;i++)
{ cin>>s;
if(s[s.length()-]!='\\')s+='\\'; func(); }
set<string>::iterator it=ss.begin();
while(it!=ss.end()){
s=(*it);
if(s.find_last_of('\\')==string::npos)cout<<s<<endl;
else{for(int i=;i<=s.find_last_of('\\');i++)//特别注意输出格式
cout<<' '; cout<<s.substr(s.find_last_of('\\')+,s.length())<<endl;//substr第二个参数应该是从指定位置开始的长度,但是如果超过了源字符串的长度,就从指定位置到串尾 }
it++;
}
cout<<endl;
} // freopen("CON","r",stdin);
// system("pause"); return ;
}

代码巧妙地使用了set容器的自动排序功能,将目录一级一级通过string相关操作存储下来并自动排序输出,find_last_of()函数和substr函数的巧妙使用让我学习到了很多

str.find_last_of("xxx"),找到xxx最后出现的位置

str.find_last_of(''")=string::npos说明找不到,没有出现过

str.substr(i,j);i是起始位置,j是结束位置

分享我的代码:

由于在一开始就想用map把空格数存储下来,只是不知道该如何提取每一级目录

#include<iostream>
#include<map>
#include<string>
#include<string.h>
using namespace std;
map<string,int> dir;//想用map的键代表目录,值代表空格数
void fun(string str)
{
int flag = ;
for(int i=;i<str.length();i++)
{
if(str[i] == '\\'){
dir.insert(pair<string,int>(str.substr(,i),flag+));//flag记录的是上一个“\”出现的位置,flag+1也就是要输出的空格数
flag = i;
}
}
}
int main()
{
int n;
string str; map<string,int>::iterator it; while(cin>>n&&n!=)
{
dir.clear(); //清空map
for(int i=;i<n;i++)
{
cin>>str;
if(str[str.length()-] != '\\')//如果不是根目录在每个字符串后面添加“\”,以便下一步的操作
str+='\\';
fun(str); } for(it = dir.begin();it!=dir.end();it++)
{
if(it->first.find_last_of('\\')==string::npos)//根目录
cout<<it->first<<endl;
else{
for(int i=;i<it->second;i++)//输出空格
cout<<" ";
cout<<it->first.substr(it->first.find_last_of('\\')+,it->first.length())<<endl;
} }
cout<<endl;
}
return ;
}

/*
运行时间:51ms


占用内存:820k
*/

题目中还要注意的是格式问题,该题目明确规定“每一个测试样例的输出紧跟一个空行。”,就要在while结束前添加回车!

上一篇:Android异步消息机制


下一篇:eclipse的使用、优化配置