当前位置: 面试刷题>> 简化路径 (经典算法题500道)


题目描述

给定一个字符串表示的文件系统路径,要求你将其简化为最简洁的形式。路径中的字符串可能包含.表示当前目录,..表示上级目录,以及普通文件名或目录名。路径字符串的开头和结尾均不包含斜杠/,但路径中的目录名之间会以单个斜杠/分隔。你需要返回路径简化后的结果。

示例 1:

输入: "/home/"
输出: "/home"
解释: 注意,最后一个目录名后面没有斜杠。

示例 2:

输入: "/../"
输出: "/"
解释: 从根目录向上级目录回退一级,到达根目录。

示例 3:

输入: "/home//foo/"
输出: "/home/foo"
解释: 在路径中,多余的斜杠应该被去除。

示例 4:

输入: "/a/./b/../../c/"
输出: "/c"

PHP 示例代码

function simplifyPath($path) {
    $stack = [];
    $parts = explode('/', $path);

    foreach ($parts as $part) {
        if ($part === '.' || $part === '') {
            // 当前目录或空字符串,跳过
            continue;
        } elseif ($part === '..') {
            // 返回到上一级目录
            array_pop($stack);
        } else {
            // 其他情况,压入栈中
            array_push($stack, $part);
        }
    }

    // 将栈中的目录名用斜杠连接起来
    return '/' . implode('/', $stack);
}

// 测试
echo simplifyPath("/a/./b/../../c/"); // 输出: /c

Python 示例代码

def simplifyPath(path):
    stack = []
    parts = path.split('/')

    for part in parts:
        if part == '.' or part == '':
            # 当前目录或空字符串,跳过
            continue
        elif part == '..':
            # 返回到上一级目录
            if stack:
                stack.pop()
        else:
            # 其他情况,压入栈中
            stack.append(part)

    # 将栈中的目录名用斜杠连接起来
    return '/' + '/'.join(stack)

# 测试
print(simplifyPath("/a/./b/../../c/"))  # 输出: /c

JavaScript 示例代码

function simplifyPath(path) {
    const stack = [];
    const parts = path.split('/');

    for (let part of parts) {
        if (part === '.' || part === '') {
            // 当前目录或空字符串,跳过
            continue;
        } else if (part === '..') {
            // 返回到上一级目录
            if (stack.length > 0) {
                stack.pop();
            }
        } else {
            // 其他情况,压入栈中
            stack.push(part);
        }
    }

    // 将栈中的目录名用斜杠连接起来
    return '/' + stack.join('/');
}

// 测试
console.log(simplifyPath("/a/./b/../../c/")); // 输出: /c

码小课网站中有更多相关内容分享给大家学习,希望这些示例和描述能帮助到你。

推荐面试题