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

在这里插入图片描述
在这里插入图片描述
思路:从题目的出发,一个输入的路径包含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();
    }
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的洋葱头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值