leetcode 071简化路径
题目描述
输入 一个Unix 风格的绝对路径,你需要简化它。
绝对路径包括目录名、斜杠、点(.)、两个点(…),一个点(.)表示当前目录本身;两个点 (…) 表示将目录切换到上一级(指向父目录)。
简化后的路径不包含点(.)和两个点(…),且始终以斜杠 / 开头,两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。
思路
我的思路是首先将所有斜杠变为空格,获取以空格为分隔的元素,这些元素可能是目录名、点(.)、两个点(…),忽略点(.)的情况,把其它元素从头开始依次压入栈中,然后依次弹栈,当弹出为目录名时,则压入保存结果的栈中,当弹出元素为两个点(…)的时候,则继续弹出,如果接着还弹出两个点(…),则记录目录名弹出次数为弹出的两个点(…)的个数,继续弹出,每弹出一个目录名,目录名弹出次数减1,此时弹出的目录名不压入保存结果的栈中,直到目录名弹出次数减为0。最后依此输出保存结果栈中的元素。
代码
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
string simplifyPath(string path) {
stack<string> op;
stack<string> result;
int l = path.length();
int i=0;
for(i=0;i<l;i++){
if(path[i]=='/'){
path[i]=' ';
}
}
int count=0;
for(i=l-1;i>=0;i++){
if(path[i]==' '){//记录末尾有几个空格
count++;
}else{
break;
}
}
string left_path = path.substr(0,l-count);
stringstream st(left_path);
string tpstr;
while(st>>tpstr){
if(tpstr!="."){
op.push(tpstr);
}
}
while(!op.empty()){
string val = op.top();
op.pop();
if(val==".."){
int popcount=1;
while(popcount!=0){
if(!op.empty()){
val = op.top();
op.pop();
if(val==".."){
popcount++;
}else{
popcount--;
}
}else{
popcount=0;
}
}
}else if(val!="."){
result.push(val);
}
}
string rstr="/";
while(!result.empty()){
string val = result.top();
result.pop();
rstr = rstr + val+"/";
}
rstr = rstr.length()>1?rstr.substr(0,rstr.length()-1):rstr;
return rstr;
}
易错点
1)没有目录名的情况,这时还是要输出一个’/’。
2)当弹出两个点(…)时,栈已经空了,要判断非空。
3)容易忘记存在连续的两个点(…)的情况。