Skip to content

Latest commit

 

History

History
73 lines (54 loc) · 2.01 KB

071.SimplifyPath.md

File metadata and controls

73 lines (54 loc) · 2.01 KB

71. Simplify Path

Question:

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

Example:

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

Xpath 路径规则:

Xpath 是选择XML文件中节点的方法: node(节点) 就是XML文件中最小构成单位,一共分成7种

1 2 3 4 5 6 7
element attribute text namespace processing-instruction comment root
元素 属性 文本 名称空间 处理命令 注释节点 根节点

路径表达式:Path Expression

# 斜杠(/)作为路径内部的分割符。

# 同一个节点有绝对路径和相对路径两种写法。

# 绝对路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...。

# 相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首。

# "."表示当前节点。

# ".."表示当前节点的父节点

Analysis:

使用spli('/'))切割字符串,如/a/./b/../../c/切割为:['a','.','b','..','.','c','']

,然后就好办了。使用一个栈来存储路径,然后遇到['.','']就跳过去,遇到'..'就将栈的最近元素弹出。

Solution:

class Solution {
    public String simplifyPath(String path) {
            Stack<String> stack = new Stack<>();
            for(String dir:path.split("/")) {
                if("..".equals(dir)) {
                    if(!stack.isEmpty())
                        stack.pop();
                } else if(".".equals(dir)) {
                    continue;
                } else {
                    if(!"".equals(dir)) {
                        stack.push(dir);
                    }
                }
            }
            String r = "";
            for(String dir:stack) {
                r = r + "/" + dir;
            }
            return "".equals(r)?"/":r;
    }           
}

Keypoint:

用split函数,以及一个stack栈的运用