0%

simplify-path

题目描述

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

题解

或许需要用一个栈,遇到文件名压入,遇到“/../”弹出,遇到”/./“忽略,连续的斜杠只算一个,最后再把栈里剩下的连起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
string simplifyPath(string path) {
int len = path.length();
if (len <= 1)return "/";
stack<string> s;
string str = "";
int i = 1;
while (i < len)
{
while (i < len&&path[i] == '/')i++;
if (i<len&&path[i] == '.')
{
if (i + 1 < len&&path[i + 1] == '.')
{
if (i+2==len||i + 2<len&&path[i + 2] == '/')
{
if (!s.empty())s.pop();
i += 3;
}
else if (i + 2<len)
{
while (i < len&&path[i] != '/')
{
str = str + path[i];
i++;
}
s.push(str);
str = "";
}
}
else if (i + 1 == len || i + 1 < len&&path[i + 1] == '/')
i += 2;
else
{
while (i < len&&path[i] != '/')
{
str = str + path[i];
i++;
}
s.push(str);
str = "";
}
}
else
{
while (i < len&&path[i] != '/')
{
str = str + path[i];
i++;
}
if (str.length() > 0)
s.push(str);
str = "";
}
}
string res = "";
while (!s.empty())
{
string t = s.top();
res = '/' + t + res;
s.pop();
}
if (!res.length())
return "/";
return res;
}

其实应该是可以在原来的字符串上直接修改的。

while语句总是忘了写递增条件,这是什么坏毛病。

…居然是文件名??太过分了,测试如下:

1
2
3
4
5
6
7
[root@iZm5efgntvp9yn8px32ud1Z ~]# cd ...
-bash: cd: ...: No such file or directory
[root@iZm5efgntvp9yn8px32ud1Z ~]# cd ....
-bash: cd: ....: No such file or directory
[root@iZm5efgntvp9yn8px32ud1Z ~]# cd ..
[root@iZm5efgntvp9yn8px32ud1Z /]# cd .
[root@iZm5efgntvp9yn8px32ud1Z /]#