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();
        }
    }
  • 相关阅读:
    POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
    POJ 3083 Children of the Candy Corn bfs和dfs
    POJ 2049 Finding Nemo bfs 建图很难。。
    POJ 2513 Colored Sticks 字典树、并查集、欧拉通路
    POJ 1013 Counterfeit Dollar 集合上的位运算
    POJ 2965 The Pilots Brothers' refrigerator 位运算枚举
    无聊拿socket写的100以内的加法考试。。。
    POJ 1753 Flip Game
    初学socket,c语言写的简单局域网聊天
    汇编语言 复习 第十一章 标志寄存器
  • 原文地址:https://www.cnblogs.com/airwindow/p/4779850.html
Copyright © 2011-2022 走看看