葵花宝典

vuePress-theme-reco 前端小菜-贺俊兰    2021
葵花宝典 葵花宝典

Choose mode

  • 关灯
  • 自动
  • 开灯
主页
分类
  • LeetCode
  • JavaScript
  • Node
  • 其他
  • VUE
标签
时间轴
author-avatar

前端小菜-贺俊兰

33

文章

7

标签

主页
分类
  • LeetCode
  • JavaScript
  • Node
  • 其他
  • VUE
标签
时间轴
  • LeetCode

    • 两数之和
    • 三数之和
    • 有效括号
    • 斐波那契数列
    • 杨辉三角
    • 相同的树
    • 简化路径

简化路径

vuePress-theme-reco 前端小菜-贺俊兰    2021

简化路径

前端小菜-贺俊兰 2020-09-12 LeetCode

# 介绍

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 分析

分析题目得知以下几点信息:

  1. ' ' 为当前目录
  2. '.' 为当前目录
  3. '..' 为当前目录的上级目录

所以根据分析得出思路:

采用栈方法来实现,当传入参数为字符串时,根据'/'来转化为数组,然后依据分析出的三点来做判断,最后返回的时候如果栈是空的要记得加上跟目录'/'

# 实现代码

/**
 * @param {string} path
 * @return {string}
 */
var simplifyPath = function(path) {
    let stack = []
    const pathList = path.split('/')

    //' ', '.' , '..'
    //["", "a", "..", "..", "b", "..", "c", "", ".", "", ""]
    for (let i = 0; i < pathList.length; i++) {
        const p = pathList[i]
        if (p && p == '..'){
            stack.pop()
        }else if(p && p!='.'){
            stack.push('/'+p)
        }
    }
    return stack.length>0?stack.join(''):'/'

};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
欢迎来到 葵花宝典
看板娘