leetcode 71. 简化路径

题目链接
思路:栈+字符串切割
分析:根据题目意思,也就是说只有 ‘.’ 与 '…‘是特殊的,题目中说了’…'三个点等视为文件/目录名称,那么就是只有两个特殊情况一个点与两个点。
首先,我们将path用 / 切开。
也就得到了一个字符串数组,那么我们按个进行处理即可。
我们用栈来存当前路径,当我们遇到以下三种情况,分别处理。
情况一:遇到一个点,也就是在当前路径,那么直接跳过即可。
情况二:遇到两个点,也就是回退到上一级,那么也就是栈顶回退一个目录。
情况三:如果不是上面两种情况,那么肯定是目录了,那么将这个目录加进去即可,不过加目录前先加上一个/,并且保证栈内不是/结尾。
代码:

class Solution {
    public String simplifyPath(String path) {
        String[] ps = path.split("/");
        //记录当前路径,一定是目录结尾,不会是 / 结尾
        char[] stack = new char[path.length()];
        int top = -1;

        for(String item : ps){
            if(item.equals("..")){
                //如果栈不是空的,那么回退一个目录
                while(top!=-1 && stack[top]!='/'){
                    top--;
                }
                //并且把最后的  '/'也给回退,为了保证不是/结尾
                if(top!=-1){
                    top--;
                }
                //如果遇到了  .  那么就是说是当前目录,那么直接跳过     空串是因为切割出来产生的,所以也直接跳过
            }else if(item.equals(".")||"".equals(item)){
                continue;
                
            }else{
                //其他的肯定是目录,那么在入栈之前加上 / 然后再加上目录名    也就是  /file
                stack[++top]='/';
                for(int i = 0; i < item.length(); i++){
                    stack[++top] = item.charAt(i);
                }
            }
        }

        //因为栈内的路径不会是  / 结尾   那么如果栈是空的话,那么就说明是在根目录下
        return top==-1? "/" : new String(stack,0,top+1);
    }
}

疫情安心隔离。
愿疫情早日结束。

你可能感兴趣的:(算法,leetcode,算法)