【JS每日一算法】🟨65.简化路径(栈)

391 阅读2分钟

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

Unix风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠'/'。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

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

提示:

  • 1 <= path.length <= 3000
  • path 由英文字母,数字,'.''/''_' 组成。
  • path 是一个有效的 Unix 风格绝对路径。

示例:

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

题解:

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 栈    TC:O(n)  SC:O(n)
 * @author: JunLiangWang
 * @param {*} path  给定路径
 * @return {*}
 */
function stack(path) {
    /**
     * 本方案利用栈的方式,我们以'/'分割路径,然后遍历分割的元素(即为目录),当
     * 遇到目录名不等于'','.'时我们将该目录入栈(由于当前目录是'.'或''时,我们
     * 需要将其删除,我们不入栈就等同于删除,因此当前目录不等于'.'或''时,入栈),
     * 当遇到目录名等于'..'时,则需要回退到上级目录,此时弹出栈中栈顶元素即可。最
     * 后我们将栈中元素使用'/'链接返回即可
     */

    // 存放当前目录
    let content = '',
    // 存放之前的目录的栈
    stackArray = [];

    // 遍历路径,以'/'分割路径
    for (let i = 0; i < path.length; i++) {
        // 当前字符如果不是'/',则证明是目录
        if (path[i] != '/') {
            content += path[i]
        }
        // 如果当前字符是'/',证明当前以获得当前目录
        // 此时需要判断当前目录的类型
        else {
            // 如果当前目录是'..',则需要回退到上级目录
            // 此时弹出栈中栈顶元素即可
            if (content == '..') stackArray.pop();
            // 由于当前目录是'.'或''时,我们需要将其删除
            // 由于我们不入栈就等同于删除,因此当前目录不
            // 等于'.'或''时,入栈
            else if (content != '.' && content != '') stackArray.push(content);
            // 当前目录清空
            content = '';
        }
    }

    // 防止结尾无'/',因此遍历完成后仍要判断一次
    if (content == '..') stackArray.pop();
    else if (content != '.' && content != '') stackArray.push(content);
    // 返回结果
    return '/' + stackArray.join('/');
}

来源:力扣(LeetCode)