题目描述:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
Corner Cases:
首先了解一下Unix中目录的操作是怎样的:
- 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"
.
"/"代表根目录;
“.”代表当前目录,本题中碰见该符号应该忽略;
“..”代表返回上级目录,当上级目录为根目录时不进行操作;
“...”任何多于两个'.'的均为合法目录名。
用Java的话我想直接split处理起来应该很方便。需要注意多余的"/"应该去掉。
我在path的最后手动加了一个“/”来保证最后一节的输出。
代码如下:
class Solution {
public:
string simplifyPath(string path) {
string ret;
int dot(0);
vector<string> split;
int prev(0);
path += '/';
for (int i = 0; i < path.length(); i++){
if (path[i] == '.')
dot++;
if (path[i] != '/')
continue;
if (i - prev>1){
if (i - prev - 1 == dot){
if (dot == 2&&split.size())
split.pop_back();
else if (dot!=1&&dot!=2)
split.push_back(path.substr(prev, i - prev));
}
else
split.push_back(path.substr(prev, i - prev));
}
prev = i;
dot = 0;
}
for (int i = 0; i < split.size(); i++)
ret += split[i];
if (ret == "")
ret = "/";
return ret;
}
};