题目
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
- 始终以斜杠 '/' 开头。
- 两个目录名之间必须只有一个斜杠 '/' 。
- 最后一个目录名(如果存在)不能 以 '/' 结尾。
- 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
- 返回简化后得到的 规范路径 。
输入: path = "/../" 输出: "/" 解释: 从根目录向上一级是不可行的,因为根目录是你可以到达的最高级
题解
我们根据上面的要求进行实现,先创建一个变量为
stack
,它是一个空的栈,用于存放我们的拆分后保存的路径,在声明一个str
变量,它是用于存放我们保存拆分后拼接的字符串路径,也是结果路径,函数执行完成之后需要返回出去,在声明一个pathArr
变量,存放的是通过split
方法把出参path
进行拆分的数组,进行循环pathArr
遍历,在循环的过程中,我们通过if
语句进行判断当前拆分后的路径在决定对stack
变量做出栈还是入栈的操作,循环过后通过pathArr.length
判断当前存放拆分出参数组的数组中是否有数据,如果有数据则通过/
加上stack
数组使用join('/')
方法拼接出来的字符串赋值给接收结果的str
变量,如果没有数组则直接把/
赋值给接收结果的str
变量,最后进行返回
/** * @param {string} path * @return {string} */ var simplifyPath = function(path) { let stack=[]; let str=''; let pathArr=null; pathArr=path.split('/'); pathArr.forEach(R=>{ // 在循环的时候我们需要判断当前的数据它存在且等于..则进行出栈操作 if(R&&R=='..'){ stack.pop(); }else if(R&&R!='.'){ // 如果我们当前的数据存在且等于.,我们则执行入栈操作 stack.push(R); } }) if(pathArr.length){ str='/'+stack.join('/'); }else{ str='/'; } return str; };