题目
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = “/home/“, => “/home”
path = “/a/./b/../../c/“, => “/c”
思路1:
这个问题其实是一个双端队列的问题
- 每次碰到一个
/
或者连续很多的/
就生成新的目录,让后将目录到addLast
到双端队列里
- 每次碰到
.
相当于不动,..
相当于尾部出队。
- 需要注意特殊的case,比如多个
/
连接在一起,我用的是getNextSubPath
函数来处理这个情况,在第二个方法中有更加有优雅的方式那就是正则表达式.
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
public class Solution {
private int j;
public String simplifyPath(String path) {
StringBuilder sb= new StringBuilder();
LinkedList<String> queue =new LinkedList<>();
String temp;
char[] cs=path.toCharArray();
for( int i=0;i<path.length();){
temp=getNextSubPath(cs, i);
if(temp!= null){
switch (temp) {
case ".":
break;
case "..":
queue.pollLast();
break;
default:
queue.addLast(temp);
break;
}
i= j;
} else i++;
}
for(String str: queue){
sb.append( '/').append(str);
}
return sb.length()==0? "/":sb.toString();
}
private String getNextSubPath( cha[] path, int start){
int i;
for(i=start;i<path. length;i++){
if(path[i]!= '/') break;
}
for( j=i+1; j<path. length; j++){
if(path[ j]== '/') break;
}
if(i==path. length||i>= j) return null;
return new String(path,i, j-i);
}
}
|
思路2:
- 用正则表达式
/+
来分割字符串,将字符串分割为很多子串,然后其他的处理和思路1一样。
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
|
//用正则表达式
public class Solution{
public String simplifyPath(String path) {
StringBuilder sb= new StringBuilder();
LinkedList<String> queue = new LinkedList<>();
String strs[]=path.split( "/+");
for(String temp:strs){
switch (temp) {
case ".":
break;
case "..":
queue.pollLast();
break;
default:
if (!temp.isEmpty())
queue.addLast(temp);
break;
}
}
for(String str:queue){
sb.append( '/').append(str);
}
return sb.length()==0? "/":sb.toString();
}
}
|