题目
题目详解
题意:外界传过来一个unix风格代表路径的字符串,我们需要改为真实的路径字符串。具体而言就是需要把 /
内的 ..
或者 .
转为它的具体作用->回到上一级和保持当前目录。题目还规定了多个 /
代表的始终是一个 /
的效果,而两个以上的 .
就是普通的路径名字了。
根据题意,我们可以把真实路径获取转化为一个入栈的过程,而遇到 ..
就出栈,遇到 .
则原地不动,其他情况入栈即可。最后再从头到尾用 /
相连成串。
解题代码
class Solution {
public:
//TODO 这是一个双端队列的利用题
//题目对路径描述的更新,正好符合入栈的性质。而最后拼接成字符串,正好符合队列的顺序。
string simplifyPath(string path) {
char* cstr = (char*)path.c_str();//TODO 得到C风格字符串,方便调用strtok
char* part = strtok(cstr,"/"); //TODO 得到分割的部分字符串
deque<string>St; //TODO 将被 "/" 的按照一定规则内容存下来:遇到'..'pop,遇到'.'则原地不动,其余情况均入栈。
while(part!=NULL){
if(!strcmp(part,"..")){
if(!St.empty())
St.pop_back();
}
else if(!strcmp(part,"."))
void(0);
else{
St.push_back(string(part));
}
part = strtok(NULL,"/");
}
string ret;
while(!St.empty()){//TODO 从头读取到尾,队列的方式读取
ret += '/'+move(St.front());//通过move转右值防止中间过程拷贝消耗额外内存
St.pop_front();
}
return ret.empty()?"/":ret;
}
};