题目

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();

    }

}