From 436b0f2ae7db19bdd16beaa41823e27bd8104344 Mon Sep 17 00:00:00 2001 From: = <--gbloal> Date: Wed, 22 May 2024 18:10:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E7=AE=97=E6=B3=95=E9=A2=98(71)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- leetcode/中等/简化路径.js | 71 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 leetcode/中等/简化路径.js diff --git a/leetcode/中等/简化路径.js b/leetcode/中等/简化路径.js new file mode 100644 index 0000000..85a2f3d --- /dev/null +++ b/leetcode/中等/简化路径.js @@ -0,0 +1,71 @@ +/* +71. 简化路径 +中等 + +相关标签 +相关企业 +给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。 + +在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者 +都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。 + +请注意,返回的 规范路径 必须遵循下述格式: + +始终以斜杠 '/' 开头。 +两个目录名之间必须只有一个斜杠 '/' 。 +最后一个目录名(如果存在)不能 以 '/' 结尾。 +此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。 +返回简化后得到的 规范路径 。 + +示例 1: + +输入:path = "/home/" +输出:"/home" +解释:注意,最后一个目录名后面没有斜杠。 +示例 2: + +输入:path = "/../" +输出:"/" +解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。 +示例 3: + +输入:path = "/home//foo/" +输出:"/home/foo" +解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。 +示例 4: + +输入:path = "/a/./b/../../c/" +输出:"/c" + +提示: + +1 <= path.length <= 3000 +path 由英文字母,数字,'.','/' 或 '_' 组成。 +path 是一个有效的 Unix 风格绝对路径。 +*/ + +/** + * @param {string} path + * @return {string} + */ +const simplifyPath = function (path) { + path.replace(/\/+/g, '/'); // 优化,把连续的/替换成当个/,防止生成过多空格 + const parts = path.split('/'); // 把路径分隔开 + const len = parts.length; + const stack = []; + for (let i = 0; i < len; i++) { + switch (parts[i]) { + case '..': + stack.pop(); + break; + case '.': + case '': + break; + default: + stack.push(parts[i]); + } + } + return `/${stack.join('/')}`; +}; + +console.log(simplifyPath('/../'));