算法学习第三天

185 阅读2分钟

  今天来一题难度为中等,但实现思路简单的题。leetcode的第71题-简化路径
  这道题的标签是栈。做题之前先来了解下:栈是一种受限的线性表,限定只能在表尾进行插入和删除的操作,这个就是栈后进先出的特点的由来。javascript原生方法是没有栈这个api的,但可以用数组来维护一个栈,比如只对这个数组进行push和pop达到增删即可,至于查看栈顶和栈大小则可以通过数组的下标索引和length实现。
  来看下题目:

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

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

  给出一个文件的绝对路径,编写一个方法对这个路径进行简化,从示例可以看出,里面是有多余路径字段的,而我们要做的就是去掉多余字段。当熟悉了栈的特性,就可以直接上手了。

var simplifyPath = function(path) {
    const stack = []
    const strArr = path.split('/')
    for (let i = 0; i < strArr.length; i++) {
        switch (strArr[i]) {
            case '':
            case ".": {
                break
            }
            case "..": {
                stack.pop()
                break
            }
            default: {
                stack.push(strArr[i])
                break
            }
        }
    }
    return `/${stack.join('/')}`
};

  思路就是利用栈来维护文件夹层级。当遇到"../"时,需要减掉一层文件夹名称,所以对栈进行pop操作;当遇到"./"和""时,不需要操作;当遇到其它内容可以认为是文件夹名称,把它push进栈。最后把栈变成字符串并返回,注意题目有要求:返回的规范必须始终以斜杠/开头。
  今天这题主要是熟悉栈的特性以及计算机文件夹路径特点。