题目要求
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”.
熬夜战leetcode,终于将这道中等难度的题做出来了,此题思路不难,就算死磕也能磕出来,我通过不断地打补丁,修复未考虑的情况,终于完成了此题,但是拿我的代码与另一大神代码相比,简直令我汗颜,特此把这两份代码都粘贴出来,以此勉励自己写出逻辑更清晰,风格更赏心悦目的代码。
大神的代码
class Solution {
public:
string simplifyPath(string path) {
if (path.empty()) return path;
stringstream out(path);
vector<string> segs;
string curr;
while (getline(out, curr, '/')) {
if (curr == "" || curr == ".") continue;
if (curr == ".." && !segs.empty()) segs.pop_back();
else if (curr != "..") segs.push_back(curr);
}
string res = "";
for (auto s: segs)
res = res + "/" + s;
return res.empty()? "/": res;
}
};
我的代码
class Solution {
public:
string simplifyPath(string path) {
if(path.empty())
return"/";
stack<string>work;
work.push("/");
int i=0;
while(i<path.size()){
if(path[i]=='/'){
if(work.top()=="/"){
++i;
}
else{
work.push("/");
++i;
}
}else if(path[i]=='.'){
if(i+1<path.size()){
if(path[i+1]=='.'){
if(i+2<path.size() && path[i+2]=='/' || i+2>=path.size()){
if(work.size()==1){
i=i+2;
}else{
work.pop();
while(work.top()!="/"){
work.pop();
}
i=i+2;
}
}else{
while(i<path.size() && path[i]=='.'){
work.push(".");
++i;
}
}
}else if(path[i+1]=='/'){
i=i+2;
}else{
work.push(".");
++i;
}
}else{
break;
}
}else{
string name;
while(i<path.size() && path[i]!='/' && path[i]!='.'){
name.push_back(path[i]);
++i;
}
work.push(name);
}
}
string res;
if(work.top()=="/"){
if(work.size()==1)
return "/";
else
work.pop();
}
while(!work.empty()){
string tmp=work.top();
work.pop();
res=tmp.append(res);
}
return res;
}
};
才疏学浅的我,没有片刻停下的理由!