前端算法-简化路径

73 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

题目

给你一个字符串 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;
};

坚持努力,无惧未来!