• lintcode 中等题:Simplify Path 简化路径


    题目

    简化路径 

    给定一个文档(Unix-style)的完全路径,请进行路径简化。

    样例

    "/home/", => "/home"

    "/a/./b/../../c/", => "/c"

    挑战
    • 你是否考虑了 路径 = "/../" 的情况?

      在这种情况下,你需返回"/"

    • 此外,路径中也可能包含双斜杠'/',如 "/home//foo/"

      在这种情况下,可忽略多余的斜杠,返回 "/home/foo"

    解题

    linux 没碰过,真的表示不知道这个是什么鬼

    参考链接, 参考链接2

    Unix的path规则可以在这里了解:
    http://en.wikipedia.org/wiki/Path_(computing)

    路径简化的依据是:

    当遇到“/../"则需要返回上级目录,需检查上级目录是否为空。

    当遇到"/./"则表示是本级目录,无需做任何特殊操作。

    当遇到"//"则表示是本级目录,无需做任何操作。

    当遇到其他字符则表示是文件夹名,无需简化。

    当字符串是空或者遇到”/../”,则需要返回一个"/"。

    当遇见"/a//b",则需要简化为"/a/b"。

     

    先将字符串依"/"分割出来,然后检查每个分割出来的字符串。

    当字符串为空或者为".",不做任何操作。

    当字符串不为"..",则将字符串入栈。

    当字符串为"..", 则弹栈(返回上级目录)。

    这样栈内的字符就是答案,但是需要进行重新组合

    以“/”隔开组合

    public class Solution {
        /**
         * @param path the original path
         * @return the simplified path
         */
        public String simplifyPath(String path) {
            // Write your code here
            if(path==null)
                return null;
            String[] p = path.split("/");
            Stack<String> stack = new Stack<String>();
            for(int i=0;i<p.length;i++){
                if(p[i].equals(".") || p[i].isEmpty()){
                    continue;
                }else if(p[i].equals("..")){
                    if(!stack.empty()){
                        stack.pop();
                    }
                }else{
                    stack.push(p[i]);
                }
            }
           StringBuilder sb = new StringBuilder();
            while (!stack.isEmpty()) {
                sb.insert(0, stack.pop());
                sb.insert(0, "/");
            }
        return sb.length() == 0 ? "/" : sb.toString();
    
            
        }
    }
    Java Code

    总耗时: 9414 ms

    class Solution:
        # @param {string} path the original path
        # @return {string} the simplified path
        def simplifyPath(self, path):
            # Write your code here
            if path == None:
                return None
            p = path.split("/")
            stack = []
            for s in p:
                if s == '.' or len(s)==0:
                    continue
                elif s == '..':
                    if len(stack)!=0:
                        stack.pop()
                else:
                    stack.append(s)
            res = ""
            if len(stack)==0:
                return "/"
            for i in stack:
                res += "/"+i
            return res 
    Python Code

    总耗时: 450 ms

  • 相关阅读:
    【习题 6-10 UVA
    【习题 6-9 UVA
    【习题 6-8 UVA
    【NOIP2016练习】T1 挖金矿(二分答案)
    O(n)求1-n的逆元
    【NOIP2016练习】T1 string (计数)
    【NOIP2016练习】T2 跑跑步 (数论)
    【NOIP2016练习】T3 tree (树形DP)
    【CF679B】Theseus and labyrinth(数学,贪心)
    【NOIP2016练习】T2 旅行(树形DP,换根)
  • 原文地址:https://www.cnblogs.com/theskulls/p/4956491.html
Copyright © 2020-2023  润新知