Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

71. 简化路径 #7

Open
yankewei opened this issue Feb 29, 2020 · 0 comments
Open

71. 简化路径 #7

yankewei opened this issue Feb 29, 2020 · 0 comments
Labels
中等 题目难度为中等 字符串 题目类型为字符串 题目包含栈解法

Comments

@yankewei
Copy link
Owner

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

示例 1:

输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。

示例 2:

输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。

示例 3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:

输入:"/a/./b/../../c/"
输出:"/c"

示例 5:

输入:"/a/../../b/../c//.//"
输出:"/c"

示例 6:

输入:"/a//b////c/d//././/.."
输出:"/a/b/c"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/simplify-path

// 可以使用栈的概念来解答
// 可以先把字符串切割成切片s,然后再声明一个空的切片ret,遍历切片s,如果是 ".","" 直接跳过,如果是 ".." 并且切片ret不为空,则需要把切片ret的最后一个元素弹出。最后把切片ret转换为字符串即可
func simplifyPath(path string) string {
    s := strings.Split(path, "/")
    var ret []string
    for _, v := range s {
        if v == "." || v == "" {
            continue
        }
        if v == ".." {
            if len(ret) != 0 {
                ret = ret[:len(ret) - 1]
            }
            continue
        }
        ret = append(ret, string(v))
    }
    return "/" + strings.Join(ret, "/")
}
@yankewei yankewei added 中等 题目难度为中等 字符串 题目类型为字符串 题目包含栈解法 labels Feb 29, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
中等 题目难度为中等 字符串 题目类型为字符串 题目包含栈解法
Projects
None yet
Development

No branches or pull requests

1 participant