Labels

Monday, February 2, 2015

Simplify Path



Simplify Path



 


Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

Naive Way: 这个看上去好复杂啊,我第一做的时候完全不懂题目是什么意思,因为没有学过cmd语句。现在做就觉得一目了然了。每一个"."表示当前文档位置,就是说停在原地不动的意思,简化的时候需要舍去,因为有没有都一样。每一个".."表示返回上级,就是说前一个有效文件路径可以作废。另外还要处理"//"的情况。

首先因为每一个"/"把每一级文件都分割开了,做好的做法当然是能把被"/"分割的每一个看成一个单位。
这是就想到了String.split()这个函数,这样可以对付"//"的情况。

然后考虑"."和"..","."当然是不要了,那么".."就要去掉上一级的文件,如果没有上一级,就要写下来。
这里实际测试的时候发现OJ居然认为"/.."要简化成"/",不管了,就是".."就要去掉上一级,如果没有上一级,也不用写下来。

一开始我用的stack,发现最后输出要再倒转一次,直接用deque(双向队列)就可以了。

public class Solution {
    public String simplifyPath(String path) {
        String s = "/";
        String[] gross = path.split("/");
        Deque<Integer> deque = new LinkedList<Integer>();
        for(int i = 0;i < gross.length;i++){
            if(gross[i].equals(".") || gross[i].equals("")){continue;}
            else if(gross[i].equals("..")){
                if(!deque.isEmpty())
                    deque.pollLast();
            }else{
                deque.offerLast(i);
            }
        }
        while(!deque.isEmpty()){
            s += gross[deque.pollFirst()];
            if(!deque.isEmpty())
                s += "/";
        }
        return s;
    }
}


 

No comments:

Post a Comment