返回

突破迷宫:LeetCode 71 号问题「简化路径」的 Swift 解法

IOS

简化路径:踏入优雅与高效的迷宫

在计算机科学的广阔领域中,路径名扮演着文件和文件夹定位的至关重要的角色。然而,冗余和不必要的信息往往会困扰路径名,例如,无处不在的「.」和「..」。简化路径 算法应运而生,旨在清除这些障碍,生成简洁而规范化的路径名。

算法之魂:栈

,一个遵循后进先出(LIFO)原则的数据结构,成为简化路径算法的灵魂。它完美契合路径名的本质——一个层次分明的文件夹结构,可视作嵌套的文件夹。

Swift 代码详解

为了进一步加深理解,让我们深入 Swift 代码实现:

func simplifyPath(_ path: String) -> String {
    var stack: [String] = []
    let components = path.components(separatedBy: "/")

    for component in components {
        if component == "." || component.isEmpty {
            // 当前路径或空路径,忽略
            continue
        } else if component == ".." {
            // 上一级路径,弹出栈顶元素
            if !stack.isEmpty {
                stack.removeLast()
            }
        } else {
            // 有效路径,压入栈中
            stack.append(component)
        }
    }

    return "/" + stack.joined(separator: "/")
}

代码逐行解读

  1. 创建一个空栈 stack
  2. 将路径名拆分成各个组件,即 / 分隔的子路径。
  3. 遍历每个组件:
    • 如果组件是「.」或空,则跳过。
    • 如果组件是「..」,则弹出栈顶元素,表示返回上一级路径。
    • 否则,将有效组件压入栈中。
  4. 最后,返回一个字符串,包含一个前导斜杠(代表根目录)和栈中组件的连接结果,由 / 分隔。

示例探索

为了巩固我们的理解,让我们探索一些示例:

  • 示例 1: 输入:"/home/",输出:"/home"
  • 示例 2: 输入:"/../", 输出:"/"
  • 示例 3: 输入:"/home/foo/../bar/", 输出:"/home/bar"

算法真谛:优雅与高效

简化路径算法的精髓在于其优雅与高效。它利用栈这种简洁的数据结构,以极高的效率遍历路径名并移除冗余信息。其优势显而易见:

  • 时间复杂度: O(n),其中 n 是组件数量。
  • 空间复杂度: O(n),因为栈最多存储所有组件。

常见问题解答

1. 栈在简化路径中的作用是什么?

栈用于存储有效路径,同时处理「..」组件,从而在向上移动时移除栈顶元素。

2. 如何处理隐藏文件和文件夹?

该算法不处理隐藏文件和文件夹,因为它们通常不包含在标准路径名中。

3. 简化路径算法是否考虑操作系统差异?

该算法适用于大多数操作系统,因为路径名通常遵循类似的约定。

4. 算法是否适用于绝对和相对路径名?

该算法适用于绝对路径名(从根目录开始),而不适用于相对路径名。

5. 如何扩展算法以处理符号链接?

为了处理符号链接,需要在算法中加入额外的逻辑来解析和解决符号链接。

总结:算法之旅

简化路径算法是一个通往算法大师殿堂的垫脚石。它展示了如何使用简单的栈结构来解决实际问题,兼具优雅和高效。通过持续探索和实践,我们将继续解锁算法迷宫的奥秘,不断提升我们的技能,迈向算法大师的境界。