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

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

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作

作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

python数据分析可视化:企业实战案例

备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

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

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

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

示例

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

方法一:使用栈

解题步骤
  1. 分割路径:使用 / 将路径分割成部分。
  2. 处理每部分:使用栈来处理每一部分。
  • 如果是 ..,则弹出栈(如果栈不为空)。
  • 如果是有效的路径名(非空且不是 .),则压入栈。
  1. 构建最终路径:从栈中弹出所有元素来构建最终的路径。
完整的规范代码
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 re
def 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 中解析出相对路径,并将其转换为服务器上的绝对路径。使用这些方法可以防止路径遍历攻击,确保服务器的安全。

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

欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
2月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
2月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
62 1
|
2月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
72 4
|
3月前
|
PyTorch 算法框架/工具 C++
人工智能算法python程序运行环境安装步骤整理
本教程详细介绍Python与AI开发环境的配置步骤,涵盖软件下载、VS2017安装、Anaconda配置、PyCharm设置及组件安装等内容,适用于Windows系统,助你快速搭建开发环境。
|
4月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
251 14
|
4月前
|
算法 Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
161 18
|
4月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
103 4
|
4月前
|
存储 机器学习/深度学习 算法
论上网限制软件中 Python 动态衰减权重算法于行为管控领域的创新性应用
在网络安全与行为管理的学术语境中,上网限制软件面临着精准识别并管控用户不合规网络请求的复杂任务。传统的基于静态规则库或固定阈值的策略,在实践中暴露出较高的误判率与较差的动态适应性。本研究引入一种基于 “动态衰减权重算法” 的优化策略,融合时间序列分析与权重衰减机制,旨在显著提升上网限制软件的实时决策效能。
127 2
|
5月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
112 4

热门文章

最新文章

推荐镜像

更多