• [LeetCode#71]Simplify Path


    Problem:

    Given an absolute path for a file (Unix-style), simplify it.

    For example,
    path = "/home/", => "/home"
    path = "/a/./b/../../c/", => "/c"

    Analysis:

    This problem is very very easy, if you really understand how to read linux path. 
    Big idea:
    Maintain a stack, then interpret the element between "/" one by one.
    iff the element is "..", we pop one element out
    iff the element is ".", we do nothing with it.
    iff the element is "directory/file name", we push it onto the stack. 

    Initial Wrong Solution:

    public class Solution {
        public String simplifyPath(String path) {
            if (path == null)
                throw new IllegalArgumentException("The passed in path is null!");
            String[] stubs = path.split("/");
            Stack<String> stack = new Stack<String> ();
            for (String stub : stubs) {
                if (stub.equals("..")) {
                    if (!stack.isEmpty())
                        stack.pop();
                } else if (!stub.equals(".")) {
                    stack.push(stub);
                } 
            }
            StringBuffer ret = new StringBuffer();
            while (!stack.isEmpty()) {
                ret.insert(0, stack.pop());
                ret.insert(0, "/");
            }
            if (ret.charAt(0) != '/')
                ret.insert(0, "/");
            return ret.toString();
        }
    }

    Mistakes Analysis:

    Even though it is easy, I have made following mistakes in implementation.
    Mistake 1: ignore the case "/", which would result in "no element pushed onto the stack".
    Then tried following error fix:
    if (ret.charAt(0) != '/')
        ret.insert(0, "/");
    This is absolutely wrong, since ret is empety, this would cause expcetion.
    Fix: 
    if (ret.length() == 0)
        return "/";
    
    Mistake 2: ignore the String.spilit could produce "" as element.
    Case: "/..."
    String.split => ["", "..."]
    Fix:
    for (String stub : stubs) {
        if (stub.equals("..")) {
        ...
        }
    }

    Solution:

    public class Solution {
        public String simplifyPath(String path) {
            if (path == null)
                throw new IllegalArgumentException("The passed in path is null!");
            String[] stubs = path.split("/");
            Stack<String> stack = new Stack<String> ();
            for (String stub : stubs) {
                if (stub.equals(""))
                    continue;
                if (stub.equals("..")) {
                    if (!stack.isEmpty())
                        stack.pop();
                } else if (!stub.equals(".")) {
                    stack.push(stub);
                } 
            }
            StringBuffer ret = new StringBuffer();
            while (!stack.isEmpty()) {
                ret.insert(0, stack.pop());
                ret.insert(0, "/");
            }
            if (ret.length() == 0)
                return "/";
            return ret.toString();
        }
    }
  • 相关阅读:
    开端
    springboot打包失败
    CONCAT_WS函数
    关于使用|作为分隔符
    JSONArray数组
    Math.ceil(double)向上取整
    $.unique(array)数组去重
    觉得没有问题,却始终没有按照预想的走的问题
    关于mouseover与mouseout以及mouseleave和mouseenter
    关于网页元素定义click事件,点击一次触发两次问题解决办法
  • 原文地址:https://www.cnblogs.com/airwindow/p/4779850.html
Copyright © 2020-2023  润新知