Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
Corner Cases:
- Did you consider the case where path =
"/../"
?
In this case, you should return"/"
. - Another corner case is the path might contain multiple slashes
'/'
together, such as"/home//foo/"
.
In this case, you should ignore redundant slashes and return"/home/foo"
.
Subscribe to see which companies asked this question.
解题技巧:
1. 重复连续出现的 '/',只按1个处理,即:跳过重复连续出现的 '/';
2. 如果路径名是 ".",则不处理;
3. 如果路径名是 "..",则需要弹栈。如果栈为空,则不做处理;
4. 如果路径名为其他字符串,入栈。
5. 最终的结果是从栈中逐个取出元素,用'/'分隔并连接起来,不过要注意顺序。
代码:
#include <iostream>
#include <stack>
using namespace std;
string simplifyPath(string path)
{
int len = path.size();
stack<string> stack1;
for(int i = 0; i < len; i++)
{
//跳过'/'
while(i < len && path[i] == '/')
i++;
//提取两个'/'之间的字符串
string tmp = "";
while(i < len && path[i] != '/')
tmp = tmp + path[i++];
//进行处理
if(tmp == ".")
{
continue;
}
else if(tmp == ".." )
{
if(!stack1.empty())
stack1.pop();
}
else if(tmp != "")
{
stack1.push(tmp);
}
}
if(stack1.empty()) return "/";
string res = "";
while(!stack1.empty())
{
res = "/" + stack1.top()+res;
stack1.pop();
}
return res;
}
int main()
{
string path;
cin>>path;
cout<<simplifyPath(path);
}