71. 简化路径
又是一道写的并不是很完美的代码
逻辑并不完美,处理头和尾的时候总是会有些问题
回头改进一下
/*
需要解决的问题:
1.尾部有/的去掉
2.带..的,将前面的删除掉
3.根目录的带 ..还是根目录
4.双斜线的去掉一个
5. . 表示当前的路径,没啥用,去掉
思路:搞个队列,从头到尾的遍历这个串,
遇到'/'就结束当前记录的串
检查当前的串的内容
如果不是'.' 或者 '..'直接塞进栈
如果是'.' 不理会,接着看后面了
如果是'..',弹出一个
while(s[i]!='/')
s+=s[i];
if(not '.' or '..') push(/+s)
else if(s=='.')
else if(s=="..") if(not empty) pop(s)
错误案例:
/... ,
/a.. , /..a
*/
class Solution {
public:
string simplifyPath(string path) {
if (path.back() != '/') {
path += '/';
}
deque<string> q;//只存依次的路径
string s = "";
for (int i = 0; i < path.size();i++) {
if (path[i] != '/') {
s += path[i];
}
else {
if (s == "..") {
if (!q.empty())
q.pop_back();
}
else if (s == ".") {
s = "";
continue;
}
else {
if (!s.empty())
q.push_back(s);
}
s = "";
}
}
string ans;
if (q.empty()) {
return "/";
}
else {
for (string s : q) {
ans += "/" + s;
}
return ans;
}
}
};
改进版
看起来功能化了很多
以后写代码注意尽量将其分块功能化
class Solution {
public:
deque<string> q;//只存依次的路径
void dealSinglePath(string name) {
if (name.empty()||name == ".") {
return;
}
else if (name == "..") {
if (!q.empty())
q.pop_back();
}
else {
q.push_back(name);
}
}
string generateResult() {
if (q.size()==0) {
return "/";
}
string ans = "";
for (int i = 0; i < q.size(); i++) {
ans += "/" + q[i];
}
return ans;
}
string simplifyPath(string path) {
string s = "";
for (char c : path) {
if (c == '/') {
dealSinglePath(s);
s = "";
}
else {
s += c;
}
}
dealSinglePath(s);
return generateResult();
}
};
结果也漂亮了很多