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

2024-04-26 21:20

本文主要是介绍掌握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 中解析出相对路径,并将其转换为服务器上的绝对路径。使用这些方法可以防止路径遍历攻击,确保服务器的安全。

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

这篇关于掌握Unix路径简化:五种有效算法比较【python力扣71题】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938686

相关文章

python面向函数

组织好的,可重复利用的,用来实现单一,或相关联功能的代码段,避免重复造轮子,增加程序复用性。 定义方法为def 函数名 (参数) 参数可动态传参,即使用*args代表元组形式**kwargs代表字典形式,代替形参,函数的return返回值有多个时组织为元组返回。 函数操作 闭包函数 指内部函数包含对外部而非全局作用域变量的引用,示例如下段代码: def out():b=13def ou

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年,X Wang受到自然界原生动物启发,提出了人工原生动物优化算法( Artificial Protozoa Optimizer, APO)。 2.算法原理 2.1算法思想 APO通过模拟原生动物的觅食、休眠和繁殖行为来模拟原生动物的生存机制。

LeetCode力扣第114题:多种算法实现 将二叉树展开为链表

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析可视化:企业实战案例 python源码解读 程序员必备的数学知识与应用 题目描述 给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树:

eclipse中怎么找到编译后的class路径

、选中你要找的类的类名 2.点下快捷键 ctrl+shift+R,会默认显示你的源文件.java的路径,如果没有.class的话,点击右上角的三角 3.选择如下图: 4.会展示出.class文件 5.双击.class文件,打开如下 6.快捷键 alt+回车,打开如下头 7.把地址拷贝到你上传工具中,打开如下,就可以直接上传编译后的class类了

【Python】Python中assert语句的用法

在 Python 中,assert 语句用于断言某个条件是真的。如果条件为 False,则会触发一个 AssertionError。这种机制常用于在开发阶段检查程序的状态,确保代码在某个特定点满足预期条件。通过这种方式,开发者可以在代码错误导致更大问题之前及时发现并修复错误。 基本语法 assert 语句的基本语法如下: assert condition, message conditi

使用Python读取las点云,写入las点云,无损坐标精度

目录 1 为什么要写这个博文2 提出一些关键问题3 给出全部代码安装依赖源码(laspy v2.x) 1 为什么要写这个博文 搜索使用python读写las点云数据,可以找到很多结果。但是! 有些只是简单的demo,且没有发现/说明可能遇到的问题;有些晦涩难懂,不够实用主义;有些须付费观看,没有开源精神。 本人在使用laspy v2.3读写点云文件时,着实被坐标精度问题难到了

面试陷阱1:Integer类型的比较

https://www.cnblogs.com/zhuzhen/p/8473167.html public class Test01 {public static void main(String[] args) {Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;System.out.println(f1 == f2);  //trueSystem.

python 和 MATLAB 都能绘制的母亲节花束!!

hey 母亲节快到了,教大家用python和MATLAB两种语言绘制花束~这段代码是我七夕节发的,我对代码进行了简化,同时自己整了个python版本 MATLAB 版本代码 function roseBouquet_M()% @author : slandarer% 生成花朵数据[xr,tr]=meshgrid((0:24)./24,(0:0.5:575)./575.*20.*pi+

找工作绕不过系列之排序算法

找工作绕不过系列已经推出了一版Java多线程,但如果你的方向是研发岗,那么排序算法也会是大家绕不过去的内容之一哦。原因有三,首先,排序算法综合了你对算法的理解,包括时空间复杂度以及数据结构。二是排序算法比较常用,规模也不会太大,用来考察再合适不过,不然考个KMP算法没几个能答得好。最后,面试官也是这么找到工作的,得饶人处且饶人哈哈,怎么忍心拿别的复杂算法欺负人呢! 那么就分享两位仁兄(两位貌似都

微信小程序开发秘籍:掌握数据缓存与离线存储的艺术

微信小程序开发秘籍:掌握数据缓存与离线存储的艺术 基本概念数据缓存离线存储 技术要点与实战1. 使用wx.setStorageSync进行简单数据缓存2. 管理复杂数据结构——使用wx.setStorage3. 离线存储策略设计4. 安全性与性能优化 结语与探讨 在微信小程序的开发过程中,数据缓存和离线存储是优化用户体验、提升应用性能的关键技术之一。本文将深入浅出,从基本概念到实