240930-71 简化路径

67 阅读1分钟

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为 更加简洁的规范路径

在 Unix 风格的文件系统中规则如下:

  • 一个点 '.' 表示当前目录本身。
  • 此外,两个点 '..' 表示将目录切换到上一级(指向父目录)。
  • 任意多个连续的斜杠(即,'//' 或 '///')都被视为单个斜杠 '/'
  • 任何其他格式的点(例如,'...' 或 '....')均被视为有效的文件/目录名称。

返回的 简化路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/' 。
  • 最后一个目录名(如果存在)不能 以 '/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。

返回简化后得到的 规范路径 。

思路

比较典型的栈类型题目,因为..会返回上一级目录,意味着要把最后进去的一个元素pop掉

 class Solution {
        public String simplifyPath(String path) {
            Deque<String> stack = new LinkedList<>();
//            先对字符串根据斜杠 /进行分割,得到一个字符串数组。这个字符串数组的字符串可能有以下几种:.、..、''、和表示目录的字母。
            String[] split = path.split("/");
            String res = "";
            int i = 0;
            while (i < split.length) {
                //其实这一步多余了
                String checkStr = split[i].replaceAll("/", "");
                if ("".equals(checkStr)) {
                   i++;
                   continue;
                }
                switch (checkStr) {
                    case ".":
                        break;
                    case "..":
                        if(stack.size() > 0) stack.pop();
                        break;
                    default:
                        stack.push(checkStr);
                }
                i++;
            }
            while (stack.size() > 0){
                String pop = stack.pop();
                res = "/" + pop + res;
            }
            return "".equals(res) ? "/" : res;
        }
    }