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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 掌握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天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
17 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
1天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
33 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
1天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
30 11
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
1天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
27 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
13天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
48 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
9天前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
24 9
|
2天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
12 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
10天前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
28 5
|
30天前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
45 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
23天前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
108 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达