【每日一题】Day0017:力扣题库NO.71. 简化路径(java实现)

这一题还是蛮有趣的。先上链接。

力扣71简化路径icon-default.png?t=LBL2https://leetcode-cn.com/problems/simplify-path/

根据提示:

·1 <= path.length <= 3000
·path 由英文字母,数字,'.','/' 或 '_' 组成。
·path 是一个有效的 Unix 风格绝对路径。

基本上不用考虑特别极端的情况,因此可以专心解答。

思路比较直接,"/"是做为分隔符分割path字符串,对每一个子串进行判断,做出对应操作即可。代码如下:

package cn.daycode.leetcode;

public class SimplifyPath {
    public static void main(String[] args) {
        String s = "/..//.././a/sd/d/..///....//.//../home/";
        System.out.println(new Solution().simplifyPath(s));
    }

    static class Solution {
        public String simplifyPath(String path) {
            // 因为主要在用拼接,所以这里用StringBuffer,初始为"/"
            StringBuffer sb = new StringBuffer("/");
            // 将path以"/"做为分隔符分割为若干子串的数组,这样很好的解决了多个连续"/"的情况
            String[] ss = path.split("/");

            // 遍历上面获取到的子串数组
            for (int i = 0; i < ss.length; i++) {
                // 对数组中每个元素判断并操作
                switch (ss[i]){
                    //以下两种情况都不需要做任何操作
                    case "":
                    case ".":
                        break;
                    //".."要返回上一级目录
                    case "..":
                        // 判断长度大于1,因为长度为1时为根目录,不需要返回上一级(也无法返回)
                        if(sb.length()>1){
                            // 根据拼接逻辑,需要返回上一级目录的情况下,需要找出倒数第二个"/"
                            int tempLength = sb.length()-1; // sb长度-1,为了去掉每次都拼接在最后的"/"
                            // 将倒数第二个"/"到sb.leng()-1位置替换为""(空字符串),模拟返回上一级目录
                            sb.replace(sb.substring(0,tempLength).lastIndexOf("/"),tempLength,"");
                        }
                        break;
                    default:
                        // 一般情况为正常目录,拼接在sb后面,并拼接一个"/"
                        sb.append(ss[i]).append("/");
                }

            }
            // 最后判断以下长度,如果大于1,返回sb长度-1的子串(因为最后一个字符是"/",不希望其输出)
            // 如果长度不大于1则长度为1,意味着是根目录,直接返回"/"即可
            return sb.toString().substring(0,sb.length()>1?sb.length()-1:1);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值