LeetCode 71 simplify-path 简化路径

题目链接

https://leetcode-cn.com/problems/simplify-path/

题意

        给出Unix系统下的一个路径,化简这个路径。其实更类似于输入cd以后,后面写了一个路径,而系统会跳转到一个确定的路径中,我们需要得到的就是这个最终的路径。例如:"/file/word/../",如果我们在前面加上cd命令,那么实际上跳转的路径是"/file"。这个过程称为化简。

题解

        这个题应用性仔细想一想是非常高的。如果自己写操作系统的话,路径跳转就是这个题了。如何将用户输入的路径转化为系统绝对路径。刚开始是没啥思路,评论说队列真是醍醐灌顶。。。我们如果把这个问题当成考试题,是不是从第一个字符开始,处理.、..、/这些个字符,碰到文件名就怎么怎么处理。标准的相对路径处理方式。那么换成程序,仍然是这样。如果我们将所有的"/"全部去除,那么剩下的就是具体的文件名。从前开始一个一个判定就行了。如果是"."就忽略,因为仍然是指当前文件,如果是".."就返回上一级,返回的时候判定是否已经在"/"了,是就不变,否则返回上一级。其他都是进入文件,在答案后面加上"/"分隔再加上文件名就行了。

        那么思路就是使用split()方法,以"/"作为符号分割字符串分成字符串数组。然后for循环顺序判定即可。大量字符串拼接,考虑StringBuilder对象来处理,因为是split()方法,所以例如:"//"这样的输入,会被分成3份,每个是字符串"",所以这个需要注意。不同情况不同判定就可以了。

        关于返回上一级这个,方法有很多,博主的方法是反向for循环,碰见"/"就跳出,substring()方法来切割字符串。当然需要额外判定是否为"/",否则会导致越界。自然,也可以使用split()分割,然后再重新拼接,最后少拼一个就行。都可以。

Java 代码

class Solution {
    public static String retUp(String path){
        int len = path.length();
        int flag = -1;
        for(int i = len-1;i >= 0;i--){
            if(path.charAt(i) == '/'){
                flag = i;
                break;
            }
        }
        if(flag == -1) return "/";
        String ret = path.substring(0,flag);
        return ret;
    }
    
    public String simplifyPath(String path) {
        if(path == null || path.compareTo("") == 0) return "/";
        path = path.trim();
        String[] strs = path.split("/");
        StringBuilder ans = new StringBuilder();
        for(int i = 0;i < strs.length;i++){
            String temp = strs[i];
            if(temp.compareTo("") == 0) continue;
            if(temp.compareTo(".") == 0) continue;
            if(temp.compareTo("..") == 0){
                ans = new StringBuilder(retUp(ans.toString()));
                continue;
            }
            if(ans.toString().compareTo("") == 0){
                ans.append("/");
            }else{
                if(ans.charAt(ans.length()-1) != '/') ans.append("/");
            }
            ans.append(temp);
        }
        if(ans.toString().compareTo("") == 0) return "/";
        return ans.toString();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值