网站做收录要多少长时间,个人网站花多少钱,wordpress关闭多版本,微信crm客户管理系统简化路径 给你一个字符串 path #xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 #xff08;以 ‘/’ 开头#xff09;#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中#xff0c;一个点#xff08;.#xff09;表示当前目录本身表示指向某一文件或目录的 Unix 风格 绝对路径 以 ‘/’ 开头请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中一个点.表示当前目录本身此外两个点 … 表示将目录切换到上一级指向父目录两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠即‘//’都被视为单个斜杠 ‘/’ 。 对于此问题任何其他格式的点例如‘…’均被视为文件/目录名称。
请注意返回的 规范路径 必须遵循下述格式
始终以斜杠 ‘/’ 开头。两个目录名之间必须只有一个斜杠 ‘/’ 。最后一个目录名如果存在不能 以 ‘/’ 结尾。此外路径仅包含从根目录到目标文件或目录的路径上的目录即不含 ‘.’ 或 ‘…’。
返回简化后得到的 规范路径 。
示例 1
输入path “/home//foo/” 输出“/home/foo” 解释在规范路径中多个连续斜杠需要用一个斜杠替换。
示例 2
输入path “/a/./b/…/…/c/” 输出“/c”
开始路径: /进入目录 a: /a当前目录 .: /a不变进入目录 b: /a/b返回上一级目录 …: /a再次返回上一级目录 …: /进入目录 c: /c通过这些步骤可以看到所有的部分按顺序处理后最终简化路径是 /c。
解题思路 拆分路径: 使用斜杠 / 将路径字符串拆分为多个部分。 使用栈处理路径部分: 创建一个栈用于存储路径中的有效部分。遍历拆分后的路径部分逐一处理如果部分为空字符串或为 .则跳过。如果部分为 ..则弹出栈顶元素如果栈不为空表示返回上一级目录。其他情况下将部分压入栈中表示进入新的子目录。构建简化后的路径: 使用栈中的部分重新构建简化后的路径确保路径以 / 开头并且各部分之间只有一个 /。
Java实现
public class SimplifyPath {public String simplifyPath(String path) {// 使用斜杠拆分路径String[] parts path.split(/);StackString stack new Stack();// 遍历每个部分for (String part : parts) {if (part.equals() || part.equals(.)) {// 跳过空字符串和 .continue;} else if (part.equals(..)) {// 弹出栈顶元素表示返回上一级目录if (!stack.isEmpty()) {stack.pop();}} else {// 其他情况下将部分压入栈中stack.push(part);}}// 构建简化后的路径StringBuilder simplifiedPath new StringBuilder();for (String dir : stack) {simplifiedPath.append(/).append(dir);}// 如果简化后的路径为空返回根目录 /return simplifiedPath.length() 0 ? simplifiedPath.toString() : /;}public static void main(String[] args) {SimplifyPath sp new SimplifyPath();System.out.println(sp.simplifyPath(/home/)); // 输出: /homeSystem.out.println(sp.simplifyPath(/../)); // 输出: /System.out.println(sp.simplifyPath(/home//foo/)); // 输出: /home/fooSystem.out.println(sp.simplifyPath(/a/./b/../../c/)); // 输出: /c}
}
时间空间复杂度
时间复杂度: O(n)其中 n 是输入路径的长度。拆分路径和遍历路径部分都需要线性时间。空间复杂度: O(n)栈空间在最坏情况下可能需要存储所有路径部分。构建最终简化路径的字符串也需要线性空间。