当前位置: 首页 > news >正文

【栈】Leetcode 71. 简化路径【中等】

简化路径

  • 给你一个字符串 path ,表示指向某一文件或目录的 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("/");Stack<String> 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/"));           // 输出: "/home"System.out.println(sp.simplifyPath("/../"));             // 输出: "/"System.out.println(sp.simplifyPath("/home//foo/"));      // 输出: "/home/foo"System.out.println(sp.simplifyPath("/a/./b/../../c/"));  // 输出: "/c"}
}

时间空间复杂度

  • 时间复杂度: O(n),其中 n 是输入路径的长度。拆分路径和遍历路径部分都需要线性时间。
  • 空间复杂度: O(n),栈空间在最坏情况下可能需要存储所有路径部分。构建最终简化路径的字符串也需要线性空间。

相关文章:

  • 美团Java社招面试题真题,最新面试题
  • Srping 历史
  • ROS学习笔记(16):夹缝循迹
  • 类 和 对象(二)
  • 分享10个国内可以使用的GPT中文网站
  • 工业4.0 企业级云MES全套源码,支持app、小程序、H5、台后管理端
  • 四川汇聚荣科技有限公司好不好?
  • Day6 LeedCode: 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
  • 关于软件设计模式的理解
  • HQL面试题练习 —— 合并数据
  • [Python]pyenv 环境配置
  • Selenium 库的爬虫实现
  • Host头攻击-使用加密和身份验证机制
  • git分支常用命令
  • Scrum 的速度如何衡量和提高
  • [deviceone开发]-do_Webview的基本示例
  • 「译」Node.js Streams 基础
  • JAVA SE 6 GC调优笔记
  • JS 面试题总结
  • Js基础知识(一) - 变量
  • Less 日常用法
  • magento 货币换算
  • markdown编辑器简评
  • node学习系列之简单文件上传
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SpingCloudBus整合RabbitMQ
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 高性能JavaScript阅读简记(三)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 技术:超级实用的电脑小技巧
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 力扣(LeetCode)56
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​一些不规范的GTID使用场景
  • # Maven错误Error executing Maven
  • # SpringBoot 如何让指定的Bean先加载
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 职场生活之道:善于团结
  • #pragma data_seg 共享数据区(转)
  • (C语言)共用体union的用法举例
  • (vue)页面文件上传获取:action地址
  • (二)PySpark3:SparkSQL编程
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (十)T检验-第一部分
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net 获取url的方法
  • .net 无限分类
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net6Api后台+uniapp导出Excel