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"
.
此题的很多特殊情况,此处代码写的不是很好!
为 . .. 字母目录,(特别是为空的情况,在此次使用了一个back_root 标志位,并且下一次还是为/重复,去重!)
返回只有在/..才返回!../ 输出为..
string simplifyPath(string path)
{
if(path.empty())return path;
int pos = 0;
string res;
bool back_root = false;
while(pos < path.size())
{
if(path[pos] == '/' || back_root)
{
back_root = false;
if(path[pos+1] == '\0' )//处理要结束的情况
{
break;
}
else if(pos +3 <= path.size()&&path[pos+1] == '.' &&path[pos+2] == '.'&&(path[pos+3] == '/'||path[pos+3] == '\0'))//..的情况
{
if(!res.empty())
{
res = res.substr(0,res.rfind('/'));//上一个地方
}
else
{
back_root = true;
res = "/";
}
pos = pos + 3;
}
else if(pos +2 <= path.size()&&path[pos+1] == '.'&&(path[pos+2] == '/'||path[pos+2] == '\0'))// .的情况
{
pos = pos + 2;
}
else if((res.size() >= 1&&res[res.size()-1]=='/')||path[pos+1] == '/') //处理 /// 多个情况,以及返回为空res多一个/也要在此处处理
{
pos++;
}
else//处理字母目录
{
int start = pos;
pos++;
while(path[pos] != '/'&&path[pos] !='\0')
{
pos++;
}
res = res + path.substr(start,pos-start);
}
}
else //处理 非/的情况!!全部加入
{
res += path[pos];
pos++;
}
}
if(res.empty())res = "/";
return res;
}
第二次:
用一个vcetor模拟栈的功能,只存储字符串。/后续的补上
string simplifyPath(string path)
{
if(path.empty())return path;
vector<string> path_vec;
int pos = 0;
while(pos < path.size()&& pos != -1 )
{
if(path[pos] == '/')
{
pos++;
int pos_end = path.find('/',pos);
string sub_str ;
if(pos_end == -1)//未找到
{
sub_str = path.substr(pos);
}
else
{
sub_str = path.substr(pos,pos_end-pos);
}
if (sub_str == ".." )
{
if(!path_vec.empty())
{
path_vec.pop_back();
}
pos = pos_end;
}
else if (sub_str == "."||sub_str == "")//只需后面移动位置,sub_str == ""为/
{
pos = pos_end;
}
else
{
path_vec.push_back(sub_str);
pos = pos_end;
}
}
}
string res;
for (int i = 0;i < path_vec.size();i++)
{
res +="/"+ path_vec[i];
}
if (path_vec.empty())
{
res = "/";
}
return res;
}