数据结构栈之leetcode47(简化路径)

186 阅读2分钟

leetCode47题:简化路径

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

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

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

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

leetcode题目链接:leetcode-cn.com/problems/si… 解题思路:
所使用到的原理及考察能力: 栈原理数组push()方法数组pop()方法考察读题理解能力
本题目是规范路径,传入的路径要按照上面的四点要求规范。将传入的路径用split()字符串方法按照'/'分割为数组,同时声明一个stack空数组,和str空字符串,遍历数组。遍历数组的值分为两种情况,情况一:val=‘..’,表示上层文件夹,stack.pop()删除,因为'../'表示返回上一层文件夹,返回到../符号之前的文件夹所在文件夹下,所以要stack.pop()掉;情况二:val != ‘.’,因为./表示当前文件夹下,'./'之前的文件夹就已经代表了'./',所以不需要push到stack数组中。注意:情况一和情况二不能交换位置; 最后判断stack的length,arr.length等于0,返回‘/’;否则使用数组join('/')方法转换成以/分开的字符串
复杂度: 时间复杂度O(n)、空间复杂度O(n)

var simplifyPath = function(path) {
    let arr= path.split('/')
    let stack = []
    let str = ''
    arr.forEach(item=>{
        if(item && item === '..'){
            stack.pop()
        }else if(item && item != '.'){
            stack.push(item)
        }
    })
     arr.length ? str='/' + stack.join('/') : str='/'
     return str
};