试题编号: | 201604-3 |
试题名称: | 路径解析 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在操作系统中,数据通常以文件的形式存储在文件系统中。文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。文件有内容,用于存储数据。目录是容器,可包含文件或其他目录。同一个目录下的所有文件和目录的名字各不相同,不同目录下可以有名字相同的文件或目录。 对于 d4 目录下的 f1 文件,可以用绝对路径 /d2/d4/f1 来指定。如果当前目录是 /d2/d3,这个文件也可以用相对路径 ../d4/f1 来指定,这里 .. 表示上一级目录(注意,根目录的上一级目录是它本身)。还有 . 表示本目录,例如 /d1/./f1 指定的就是 /d1/f1。注意,如果有多个连续的 / 出现,其效果等同于一个 /,例如 /d1///f1 指定的也是 /d1/f1。 输入格式 第一行包含一个整数 P,表示需要进行正规化操作的路径个数。 输出格式 共 P 行,每行一个字符串,表示经过正规化操作后的路径,顺序与输入对应。 样例输入 7 样例输出 /d2/d4/f1 评测用例规模与约定 1 ≤ P ≤ 10。 |
#include<iostream>
using namespace std;
string deal(string s){//注意!判定情况时要严谨
for(int i=0;i<s.size();i++){
if(s[i]=='/' && s[i+1]=='/'){//一定要完全保证是 ‘//’的情况
s.erase(i+1,1);i--;
}
if(s[i]=='/' && s[i+1]=='.' && s[i+2]=='/'){//一定要完全保证是 ‘/./’的情况 ,
//不能用‘/.’或‘./’进行判定 ,因为可能有/d1./的情况 ,只有/./这一种情况才算正规
s.erase(i+1,2);i--;
}
}
for(int i=0;i<s.size();i++){
if(s[i]=='.' && s[i+1]=='.' && s[i+2]=='/' && s[i-1]=='/'){//一定要完全保证是 ‘/../’的情况 ,
//不能用‘/..’或‘../’或‘..’来判定 ,因为可能有/d1../的情况 ,只有/../这一种情况才算正规
int j=i+2;i-=2;
if(i<0){
s.erase(0,j);
}else{
while(s[i]!='/')i--;
s.erase(i,j-i);i--;
}
}
}
if(s[s.size()-1]=='/' && s.size()>1)s.erase(s.size()-1,1);
return s;
}
int main(){
int n;
string str,s;
cin>>n>>str;
getline(cin,s);
while(n--){
getline(cin,s);
if(s[0]!='/')
s=str+"/"+s;
cout<<deal(s)<<endl;
}
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答