题目
本题会给出一些路径,要求对于每个路径,给出正规化以后的形式。一个路径经过正规化操作后,其指定的文件不变,但是会变成一个不包含 . 和 .. 的绝对路径,且不包含连续多个 / 符号。如果一个路径以 / 结尾,那么它代表的一定是一个目录,正规化操作要去掉结尾的 /。若这个路径代表根目录,则正规化操作的结果是 /。若路径为空字符串,则正规化操作的结果是当前目录。 输入格式 第一行包含一个整数 P,表示需要进行正规化操作的路径个数。 第二行包含一个字符串,表示当前目录。 以下 P 行,每行包含一个字符串,表示需要进行正规化操作的路径。 输出格式 共 P 行,每行一个字符串,表示经过正规化操作后的路径,顺序与输入对应。 样例输入 7 /d2/d3 /d2/d4/f1 ../d4/f1 /d1/./f1 /d1///f1 /d1/ /// /d1/../../d2 样例输出 /d2/d4/f1 /d2/d4/f1 /d1/f1 /d1/f1 /d1 / /d2 评测用例规模与约定 1 ≤ P ≤ 10。 文件和目录的名字只包含大小写字母、数字和小数点 .、减号 - 以及下划线 _。 不会有文件或目录的名字是 . 或 .. ,它们具有题目描述中给出的特殊含义。 输入的所有路径每个长度不超过 1000 个字符。 输入的当前目录保证是一个经过正规化操作后的路径。 对于前 30% 的测试用例,需要正规化的路径的组成部分不包含 . 和 .. 。 对于前 60% 的测试用例,需要正规化的路径都是绝对路径。
解题思路
字符串剪切,栈操作(pop来模拟”..”上一级目录)
代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<string> split(
string str,
string ch);
string handle(
vector<string> v);
vector<string> vCurPath;
string curPath;
int main()
{
int num=
0;
cin>>num;
cin>>curPath;
vCurPath=split(curPath,
"/");
string* arr=
new string[num];
for (
int i =
0; i < num; ++i)
{
cin>>arr[i];
}
vector<string> v;
for (
int i =
0; i < num; ++i)
{
v=split(arr[i],
"/");
string res=handle(v);
cout<<res<<endl;
}
return 0;
}
vector<string> split(
string str,
string ch){
int a=
0,b=
0;
b=str.find(ch,a);
string temp;
std::
vector<string> v;
while(b!=
string::npos){
temp=str.substr(a,b-a);
v.push_back(temp);
a=b+
1;
b=str.find(ch,a);
}
temp=str.substr(a);
v.push_back(temp);
return v;
}
string handle(
vector<string> v){
vector<string> vTemp;
if(v[
0]!=
""){
vTemp=vCurPath;
vTemp.erase(vTemp.begin());
}
for (
int i =
0; i < v.size(); ++i)
{
if(v[i]==
"."||v[i]==
""){
continue;
}
else if (v[i]==
"..")
{
if(vTemp.size()!=
0)
vTemp.pop_back();
continue;
}
else{
vTemp.push_back(v[i]);
}
}
string res;
for (
int i =
0; i < vTemp.size(); ++i)
{
res=res+
"/"+vTemp[i];
}
if(vTemp.size()==
0){
res=
"/";
}
return res;
}
转载请注明原文地址: https://ju.6miu.com/read-1307547.html