算法训练:简化路径(栈)

在这里插入图片描述
在这里插入图片描述
思路:从题目的出发,一个输入的路径包含5种东西,第一个是路径信息,即大小写的字母a,b,c,第二种是"…“用来指代上级目录,第三种是”.",第四种是"/",第五种是空字符"",而输出的路径是/加上路径信息,所以另外的3中东西用于判断是否需要将路径信息入栈出栈。

步骤:
①将输入的字符串用String类自带的split方法,用"/“将字符串分割,并存放到一个数组中,此时的数组中包含的元素就是以上5种情况的组合。
②遍历数组,对数组中的元素进行判断,如果是栈不空的情况下,且遇到”…",即返回上级目录,因此要将栈中的路径信息出栈,这样就不会在输出的时候输出该路径信息。
③当排除了…的情况之后,如果遇到的不是空字符串"“和表示当前目录的”.",则将数组中的路径信息入栈。
④最后就是输出阶段,如果最后栈中为空,即路径信息是空的,则返回根目录"/",如果栈不空的话,那么就从栈底开始取元素,利用stack自带的get方法从栈底取元素,虽然这样会跟栈设计的初衷有点违背,但是从思路上讲,是可以将栈逆序输入到一个数组中然后在顺序输出的,利用get只是简化了这一个步骤而已,输出的时候用StringBuffer的append方法来拼接字符,是因为利用StringBuffer能够减少执行时间,提升性能,当然用StringBuilder也是可以的,两个的区别在于StringBuffer是多线程安全的,SringBuilder是非多线程安全的,前者稍微慢了那么一丢丢,问题不是很大。

class Solution {
    
    
    public String simplifyPath(String path) {
    
    
        Stack<String> stack = new Stack<>();
        //用'/'来分割path,并存放到字符串数组str中
        //错误1:要使用双引号
        String[] str = path.split("/");
        //使用增强for循环来遍历str,将路径信息入栈
        for (String s : str) {
    
    
            //嵌套if和在第一个if里面使用&&符判断结果是不一样的,有点像概统里面的条件概率
            //如果使用&&符号,则无法排除掉str中是".."的情况,就会导致stack中出现".."
            if(s.equals(".."))
            {
    
    
                if(!stack.isEmpty()){
    
    
                    stack.pop();
                }

            }else if(!s.equals("")&&!s.equals(".")){
    
    
                stack.push(s);
            }
        }
        if(stack.isEmpty()){
    
    
            return "/";
        }
        //使用StringBuffer的append方法来提高字符串拼接的性能
        StringBuffer buffer = new StringBuffer();
        //从栈底开始取出路径信息
        for (int i = 0; i < stack.size(); i++) {
    
    
            buffer.append("/"+stack.get(i));
        }
        return buffer.toString();
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45394002/article/details/108938258
今日推荐