zoukankan      html  css  js  c++  java
  • [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();
        }
    }
  • 相关阅读:
    Unknown custom element: <el-container1>
    jQuery手机对话框插件
    告别2013,迎接2014
    淘宝开放平台主动通知的实现
    搭建JavaWeb服务器
    深入理解JavaScript执行上下文和执行栈
    为什么要选择学习Java?适合零基础的初学者的文章
    成为一名优秀的Java程序员9+难以置信的公式
    深入理解JavaScript作用域和作用域链
    JavaScript数据类型转换
  • 原文地址:https://www.cnblogs.com/airwindow/p/4779850.html
Copyright © 2011-2022 走看看