LeetCode 71 Simplify Path题解
程序员文章站
2022-03-05 11:38:05
...
首先上题目内容
该题想让我们对于输入的文件名信息进行转换。对于Linux目录文件的特点这里笔者再做几点强调:
- 一个点代表当前目录;
- 两个点代表上一级目录;
- 最简格式每一级目录间只能有一个/;
- 文件末尾不能带有/;
然后关键的问题是怎样进行转换呢?请看如下测试案例
细心一点会发现,比如/a/…/…/b/…/c//.//,每逢…退回上一级目录,每逢.保持当前目录。这里可以用栈来模拟这个过程。即:
- ‘…’表示退栈;
- 两个/之间是文件名的情况则入栈。
- 最后所有元素出栈
注意栈中元素的顺序是与实际文件名的顺序相反,最后处理时需要考虑到这个点
接下来上代码:
string simplifyPath(string path) {
stack<string> finall;
vector<string> tempf;
string finalls="";
for(int i=0;i<path.size();i++)
{
//如果字符是‘/’,则不需要处理。
if(path[i]=='/')
continue;
//否则就是其他字符,即文件夹的名字
else
{
int j=i;
//通过遍历找到下一个‘/’,表示该文件夹名的终止位置。
for(;j<path.size();j++)
{
if(path[j]=='/')
break;
}
string temp=path.substr(i,j-i);
//处理具有特殊含义的字串如.,..
//如果字串是..,则表示返回上一级目录,出栈操作。
if(temp=="..")
{
if(!finall.empty())
finall.pop();
}
//如果字串是.,表示当前目录,不做任何处理。
else if(temp==".")
{
continue;
}
//否则就是正常的文件名,入栈操作
else
{
finall.push(temp);
}
i=j;
}
}
if(finall.empty())
return "/";
//由于出栈后文件名的顺序是由内到外,需要利用一个vector来暂存信息,最后反向输出vector的信息
while(!finall.empty())
{
tempf.push_back(finall.top());
finall.pop();
}
for(int i=tempf.size()-1;i>=0;i--)
{
finalls+="/"+tempf[i];
}
return finalls;
}
然后例常来张结果图纪念:
上一篇: Nginx认识