掌握Unix路径简化:五种有效算法比较【python力扣71题】

题目描述

给你一个字符串 path,表示一个 Unix 风格的绝对路径,请你简化它并返回。

Unix 风格的绝对路径中,.. 表示返回上一级目录,. 表示当前目录。简化路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,简化的路径必须是表示绝对路径的最短字符串。

输入格式
  • path:一个字符串,表示 Unix 风格的路径。
输出格式
  • 返回一个字符串,表示简化后的路径。

示例

示例 1
输入: path = "/home/"
输出: "/home"
解释: "/home" 和 "/." 本质上是一样的,前者是简化的路径。
示例 2
输入: path = "/../"
输出: "/"
解释: "/../" 将会移到根目录。

方法一:使用栈

解题步骤
  1. 分割路径:使用 / 将路径分割成部分。
  2. 处理每部分:使用栈来处理每一部分。
    • 如果是 ..,则弹出栈(如果栈不为空)。
    • 如果是有效的路径名(非空且不是 .),则压入栈。
  3. 构建最终路径:从栈中弹出所有元素来构建最终的路径。
完整的规范代码
def simplifyPath(path):"""使用栈简化 Unix 风格的绝对路径:param path: str, 输入的 Unix 风格路径:return: str, 简化后的路径"""stack = []parts = path.split('/')for part in parts:if part == '..':if stack:stack.pop()elif part and part != '.':stack.append(part)return '/' + '/'.join(stack)# 示例调用
print(simplifyPath("/home/"))  # 输出: "/home"
print(simplifyPath("/../"))    # 输出: "/"
算法分析
  • 时间复杂度:(O(n)),其中 n 是路径的长度。
  • 空间复杂度:(O(n)),使用了栈来存储路径的各个部分。

方法二:直接解析

解题步骤
  1. 遍历和解析:直接在遍历过程中处理路径。
  2. 应用路径规则:同方法一,直接处理和压栈。
完整的规范代码
def simplifyPath(path):"""直接解析路径以简化 Unix 风格的绝对路径:param path: str, 输入的 Unix 风格路径:return: str, 简化后的路径"""parts = path.split('/')stack = []for part in parts:if part == '..':if stack:stack.pop()elif part and part != '.':stack.append(part)return '/' + '/'.join(stack)# 示例调用
print(simplifyPath("/home/"))  # 输出: "/home"
print(simplifyPath("/../"))    # 输出: "/"

方法三:递归

解题步骤
  1. 定义递归函数:递归地处理路径,将路径分解为头部和尾部。
  2. 递归简化:根据头部处理剩余的路径。
完整的规范代码
def simplifyPath(path):"""使用递归简化 Unix 风格的绝对路径:param path: str, 输入的 Unix 风格路径:return: str, 简化后的路径"""def recursive(parts):if not parts:return []part = parts.pop(0)if part == '..':return recursive(parts)elif part == '.' or not part:return recursive(parts)else:return [part] + recursive(parts)parts = path.split('/')result = recursive(parts)return '/' + '/'.join(result)# 示例调用
print(simplifyPath("/home/"))  # 输出: "/home"
print(simplifyPath("/../"))    # 输出: "/"

方法四:正则表达式

解题步骤
  1. 正则匹配:使用正则表达式来提取所有有效的路径部分。
  2. 重建路径:根据提取的路径部分重建整个路径。
完整的规范代码
import redef simplifyPath(path):"""使用正则表达式简化 Unix 风格的绝对路径:param path: str, 输入的 Unix 风格路径:return: str, 简化后的路径"""parts = re.findall(r'[^/]+', path)stack = []for part in parts:if part == '..':if stack:stack.pop()elif part != '.':stack.append(part)return '/' + '/'.join(stack)# 示例调用
print(simplifyPath("/home/"))  # 输出: "/home"
print(simplifyPath("/../"))    # 输出: "/"

方法五:解析并反向处理

解题步骤
  1. 反向解析:从路径末尾开始解析,使用栈处理逻辑。
  2. 重建路径:根据处理结果重建路径。
完整的规范代码
def simplifyPath(path):"""反向解析 Unix 风格的绝对路径:param path: str, 输入的 Unix 风格路径:return: str, 简化后的路径"""parts = path.split('/')stack = []for part in reversed(parts):if part == '..':stack.append(part)elif part and part != '.':if stack and stack[-1] == '..':stack.pop()else:stack.append(part)stack.reverse()return '/' + '/'.join(filter(lambda x: x != '..', stack))# 示例调用
print(simplifyPath("/home/"))  # 输出: "/home"
print(simplifyPath("/../"))    # 输出: "/"

不同算法的优劣势对比

特征方法一:使用栈方法二:直接解析方法三:递归方法四:正则表达式方法五:解析并反向处理
时间复杂度(O(n))(O(n))(O(n))(O(n))(O(n))
空间复杂度(O(n))(O(n))(O(n))(O(n))(O(n))
优势明确易懂,逻辑简单同上,代码更简洁递归思想,简洁正则清晰,易维护可处理复杂情况,灵活
劣势需要额外空间需要处理特殊情况可能栈溢出可能慢于其他方法实现稍复杂

应用示例

文件系统工具:在开发文件系统工具(如文件浏览器或命令行工具)时,路径的解析和简化是一个常见需求。例如,在实现 cd 命令或显示当前路径时,需要将用户输入的路径转换为标准化的绝对路径。

Web服务器:在处理静态文件请求时,需要从 URL 中解析出相对路径,并将其转换为服务器上的绝对路径。使用这些方法可以防止路径遍历攻击,确保服务器的安全。

通过选择适合的路径解析算法,可以提高软件的性能和安全性,同时提供更好的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图形化编程要怎么做

0. 简介 Scratch其实应该算得上最早做图形化编程的工程了。Scratch 是麻省理工学院的“终身幼儿园团队”在 2007 年 [5]发布的一种图形化编程工具,主要面对全球青少年开放,是图形化编程工具当中最广为人知的一种,所有人都可以在软件中创作自…

排序算法-计数排序

一、计数排序 这种排序算法 是利用数组下标来确定元素的正确位置的。 如果数组中有20个随机整数,取值范围为0~10,要求用最快的速度把这20个整数从小到大进行排序。 很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。…

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例,可能看着比较复杂也不知道是啥意思; 今天从理论入手重新认识下! 一、基本认识 首先,我们先了解下基础术语: 图(Graph)&…

如何实现直播声卡反向给手机充电功能呢?

在数字化时代的浪潮中,声卡作为多媒体系统的核心组件,扮演着声波与数字信号相互转换的关键角色。它不仅能够将来自各类音源的原始声音信号转换为数字信号,进而输出到各类声响设备,更能够通过音乐设备数字接口(MIDI)发出合成乐器的…

Eudic欧路词典for Mac:专业英语学习工具

Eudic欧路词典for Mac,作为专为Mac用户设计的英语学习工具,凭借其简捷高效的特点,成为众多英语学习者不可或缺的助手。 Eudic欧路词典for Mac v4.6.4激活版下载 这款词典整合了多个权威词典资源,如牛津、柯林斯、朗文等&#xff0…

​「Python大数据」词频数据渲染词云图导出HTML

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。词频数据渲染词云图导出HTML。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词词频数据渲染词云图将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python wordCloud.p…

mysql中日期函数now()和sysdate()的区别

说明: 在mysql数据库中,now()、sysdate() 都是获取系统当前日期时间 区别: 示例脚本: select sleep(2),now(),sysdate() from dual; 输出: 小结: 1、 now()和sysdate()都可以获取系统当前日期时间 2、区别…

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码,用来实现效果 subprocess.run(["python", "game代码.py"]

Faust勒索病毒:了解变种faust,以及如何保护您的数据

导言: 近年来,网络安全问题日益严峻,其中勒索病毒成为了一种日益猖獗的威胁。在众多勒索病毒中,.faust勒索病毒以其高度的隐秘性和破坏性引起了广泛关注。本文91数据恢复将深入剖析.faust勒索病毒的威胁特点,并提出相…

实现SpringMVC底层机制(一)

文章目录 1.环境配置1.创建maven项目2.创建文件目录3.导入jar包 2.开发核心控制器文件目录1.流程图2.编写核心控制器SunDispatcherServlet.java3.类路径下编写spring配置文件sunspringmvc.xml4.配置中央控制器web.xml5.配置tomcat,完成测试1.配置发布方式2.配置热加…

【stomp 实战】Spring websocket使用详解和基本原理

spring框架对websocket有很好的支持,stomp协议作为websocket的子协议,Spring也做了很多封装,让我们在开发中易于使用。 学习使用Spring的Websocket模块,当然最好的办法就是看官网说明了。本篇文章对官网做一些简述和个人的理解。 …

采集 Kubernetes 容器日志最佳实践

前言 指标、日志、链路是可观测的三大支柱,日志主要用于记录代码执行的痕迹,方便定位和排查问题。当前主流的应用都是以容器的方式运行在 Kubernetes 集群,由于容器的动态性,容器可能会频繁地创建和销毁。日志的采集和持久化变得…

用例整体执行及pytest.ini文件

在我们写代码的过程中,一般都是右键或者命令行去执行一个用例 但是当我们写完后,需要整体执行一遍。那应该怎么搞呢? 我们可以在根目录下新建一个main.py或者run.py之类的文件,文件内容如下: if __name__ "__ma…

JAVA实现easyExcel批量导入

注解类型描述ExcelProperty导入指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。…

个人电脑本地部署LLM

普通电脑配置即可本地运行大模型,本地部署LLM最简单的方法 OLLAMA Ollama是一个开源框架,专门设计用于在本地运行大型语言模型(LLM)。它的主要功能是在Docker容器中部署和管理LLM,使得在本地运行大模型的过程变得非常…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型) 数字型包含:整型int、浮点型float、布尔型bool、复数型complex 非数字型包含:字符串str、列表l…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。 CppTest下载地址:下载地址1  下载地址2 下面结合实例分析下CppTest如…

Vue3+ts(day03:ref和reactive)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

ARCGIS PRO3 三维模型OSGB转SLPK场景数据集

1.前言 因项目工作,需要将三维模型发布到arcgisserver上,但arcgisserver只支持slpk格式的模型,于是我开启了漫长的三维模型格式转换之旅,在这里记录下本人踩过的坑。 2.三维模型数据情况 2.1 模型大小:在20GB以上&a…

tcp inflight 守恒算法的自动收敛

inflight 守恒算法看起来只描述理想情况,现实很难满足,是这样吗? 从 reno 到 bbr,无论哪个算法都在描述理想情况,以 reno 和 bbr 两个极端为例,它们分别描述两种理想管道,reno 将 buffer 从恰好…