• LeetCode——71.简化路径


    以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

    在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

    请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

    示例 1:
    
    输入:"/home/"
    输出:"/home"
    解释:注意,最后一个目录名后面没有斜杠。
    
    示例 2:
    
    输入:"/../"
    输出:"/"
    解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
    
    示例 3:
    
    输入:"/home//foo/"
    输出:"/home/foo"
    解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
    
    示例 4:
    
    输入:"/a/./b/../../c/"
    输出:"/c"
    
    示例 5:
    
    输入:"/a/../../b/../c//.//"
    输出:"/c"
    
    示例 6:
    
    输入:"/a//b////c/d//././/.."
    输出:"/a/b/c"
    

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

    分别提取

    再加上两个例子 path = "/a/./b/../c/", => "/a/c" 和 path = "/a/./b/c/", => "/a/b/c", 这样我们就可以知道中间是"."的情况直接去掉,是".."时删掉它上面挨着的一个路径,而下面的边界条件给的一些情况中可以得知,如果是空的话返回"/",如果有多个"/"只保留一个。那么我们可以把路径看做是由一个或多个"/"分割开的众多子字符串,把它们分别提取出来一一处理即可,代码如下:

    C++

    class Solution {
    public:
        string simplifyPath(string path) {
            vector<string> v;
            int i = 0;
            while (i < path.size()) {
                while (path[i] == '/' && i < path.size()) ++i;
                if (i == path.size()) break;
                int start = i;
                while (path[i] != '/' && i < path.size()) ++i;
                int end = i - 1;
                string s = path.substr(start, end - start + 1);
                if (s == "..") {
                    if (!v.empty()) v.pop_back(); 
                } else if (s != ".") {
                    v.push_back(s);
                }
            }
            if (v.empty()) return "/";
            string res;
            for (int i = 0; i < v.size(); ++i) {
                res += '/' + v[i];
            }
            return res;
        }
    };
    

    stringstream

    C++中有专门处理字符串的机制,我们可以使用stringstream来分隔字符串,然后对每一段分别处理,思路和上面的方法相似,参见代码如下:

    C++

    class Solution {
    public:
        string simplifyPath(string path) {
            string res, t;
            stringstream ss(path);
            vector<string> v;
            while (getline(ss, t, '/')) {
                if (t == "" || t == ".") continue;
                if (t == ".." && !v.empty()) v.pop_back();
                else if (t != "..") v.push_back(t);
            }
            for (string s : v) res += "/" + s;
            return res.empty() ? "/" : res;
        }
    };
    

    java

    public class Solution {
        public String simplifyPath(String path) {
            Stack<String> s = new Stack<>();
            String[] p = path.split("/");
            for (String t : p) {
                if (!s.isEmpty() && t.equals("..")) {
                    s.pop();
                } else if (!t.equals(".") && !t.equals("") && !t.equals("..")) {
                    s.push(t);
                }
            }
            List<String> list = new ArrayList(s);
            return "/" + String.join("/", list);
        }
    }
    

    Python

    class Solution:
        def simplifyPath(self, path: str) -> str:
            r = []
            for s in path.split('/'):
                r = {'':r, '.':r, '..':r[:-1]}.get(s, r + [s])
            return '/' + '/'.join(r)
    
  • 相关阅读:
    Golang 之 casbin(权限管理)
    Golang validate验证器
    商城实战课程
    webstorm上的Element提示插件
    实战高并发大流量秒杀系统
    lettcode 739: 每日温度
    时钟同步 chrony
    linux 文件目录权限命令
    Nginx 四层负载均衡
    Nginx 版本回滚
  • 原文地址:https://www.cnblogs.com/wwj99/p/12258590.html
Copyright © 2020-2023  润新知