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 #49

Open
sl1673495 opened this issue May 31, 2020 · 0 comments
Open

简化路径-71 #49

sl1673495 opened this issue May 31, 2020 · 0 comments

Comments

@sl1673495
Copy link
Owner

sl1673495 commented May 31, 2020

71.简化路径

以 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"

https://leetcode-cn.com/problems/simplify-path

思路

这题看似很复杂,但是其实用栈来做还是蛮简单的,先用 / 来分割路径字符串,然后不停的把分割后的有效值 push 到栈中即可,

注意的点:

  1. 有效值的定义是:非 '..''.''' 这些特殊值以外的值。
  2. 遇到 .. 字符,说明要回退一级目录,把栈中弹出一个值即可。
  3. 最后返回的字符串值要特殊处理下,如果最后是空字符的话,直接返回 '/',否则把末尾的 '/' 给去掉后返回。
/**
 * @param {string} path
 * @return {string}
 */
let simplifyPath = function (path) {
  let tokens = path.split("/")
  let stack = []

  for (let index = 0; index < tokens.length; index++) {
    let token = tokens[index]
    if (token === "..") {
      if (stack.length > 0) {
        stack.pop()
      }
    } else if (!(token === "") && !(token === ".")) {
      stack.push(token)
    }
  }

  let res = "/"

  for (let token of stack) {
    res += `${token}/`
  }

  if (res !== "/") {
    res = res.substr(0, res.length - 1)
  }

  return res
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant