当前位置: 面试刷题>> 简化路径 (经典算法题500道)
### 题目描述
给定一个字符串表示的文件系统路径,要求你将其简化为最简洁的形式。路径中的字符串可能包含`.`表示当前目录,`..`表示上级目录,以及普通文件名或目录名。路径字符串的开头和结尾均不包含斜杠`/`,但路径中的目录名之间会以单个斜杠`/`分隔。你需要返回路径简化后的结果。
**示例 1**:
```
输入: "/home/"
输出: "/home"
解释: 注意,最后一个目录名后面没有斜杠。
```
**示例 2**:
```
输入: "/../"
输出: "/"
解释: 从根目录向上级目录回退一级,到达根目录。
```
**示例 3**:
```
输入: "/home//foo/"
输出: "/home/foo"
解释: 在路径中,多余的斜杠应该被去除。
```
**示例 4**:
```
输入: "/a/./b/../../c/"
输出: "/c"
```
### PHP 示例代码
```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 示例代码
```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 示例代码
```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
```
**码小课网站中有更多相关内容分享给大家学习**,希望这些示例和描述能帮助到你。