leetCode47题:简化路径
题目:
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
- 始终以斜杠 '/' 开头。
- 两个目录名之间必须只有一个斜杠 '/' 。
- 最后一个目录名(如果存在)不能 以 '/' 结尾。
- 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。 返回简化后得到的 规范路径 。
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
};