一开始没看懂题目,所以一些典型的测试用例靠提交来获取(不断试错)/(ㄒoㄒ)/~~
弄清楚几种情况就行了
返回上一级 | /a/。。/c | /c |
---|---|---|
– | ||
当前目录 | /a/。/c/ | /a/c |
重复 | /a//c/ | /a/c |
含点的文件名 | /a/。ccc。/ | /a/。ccc。 |
含点的文件名 | /a/。.。cc。。/ | /a/。。ccc。。 |
含点的文件名 | /a/。。。/ | /a/。。。 |
含点的文件名 | /a/。.。。cc。。。/ | /a/。。。ccc。。。 |
普通文件名 | /a/c/ | /a/c |
代码:
class Solution {
public:
string simplifyPath(string path) {
string res="";
int i=1;
while(i<path.size()){
if(path[i]=='/') i++;
else if(path[i]=='.'){// .开头
i++;
if(i<path.size() && path[i]=='.'){// ..开头
i++;
if(i<path.size()&&path[i]!='/'){//... 或者..其他 格式
string temp="..";
while(i<path.size()&&path[i]!='/'){
temp+=path[i];
i++;
}
res=res+"/"+temp;
}
else{//..切换到上一级
int j=0;
for(j;j<res.size();j++)
if(res[res.size()-1-j]=='/') break;
res=res.substr(0,res.size()-j-1);
}
}
else{// 测试点 "/.hidden"
if(i<path.size() && path[i]!='.' && path[i]!='/'){ //.其他 开头
string temp=".";
while(i<path.size() && path[i]!='/'){
temp+=path[i];
i++;
}
res=res+"/"+temp;
}
}
}
else{//目录 "/hello../world"
string temp="";
while(i<path.size()&&path[i]!='/'){
temp+=path[i];
i++;
}
res=res+"/"+temp;
}
}
if(res.size()==0) return "/";// 测试点"/../"
return res;
}
};