当前位置: 面试刷题>> 简化路径(经典算法150题)
### 题目描述
在文件系统中,路径通常由斜杠(`/`)分隔的目录或文件名组成。例如,`"/home/user/document.txt"` 是一个表示文件系统中文件路径的字符串。给定一个这样的路径字符串,我们需要编写一个函数来简化它。
路径简化的规则如下:
1. 路径中的多余斜杠(`//`)需要被替换为单个斜杠(`/`)。
2. 路径中的点(`.`)表示当前目录,因此应该被删除。
3. 路径中的点(`..`)表示上一级目录,因此需要与前一个目录名(如果有的话)抵消。
注意:
- 返回的路径应该以斜杠(`/`)开头,除非它是根目录(即只有单个斜杠)。
- 路径中不允许有多余的斜杠,也不允许末尾有斜杠(除非它是根目录)。
- 返回的路径中的目录名称应当按字典序排列(本题目中可忽略此要求,因为它更偏向于文件系统的展示而非路径简化)。
### 示例
- 输入: `"/a//b////c/d/./././.."`
- 输出: `"/a/b/c"`
### PHP 示例代码
```php
function simplifyPath($path) {
$stack = [];
$components = explode('/', trim($path, '/'));
foreach ($components as $component) {
if ($component === '.') {
// 当前目录,跳过
continue;
} elseif ($component === '..') {
// 上一级目录,如果栈不为空则弹出
array_pop($stack);
} else {
// 否则,将组件推入栈中
$stack[] = $component;
}
}
// 将栈中的组件重新组合为路径
return '/' . implode('/', $stack);
}
// 示例
echo simplifyPath("/a//b////c/d/./././.."); // 输出: "/a/b/c"
```
### Python 示例代码
```python
def simplifyPath(path):
stack = []
components = path.strip('/').split('/')
for component in components:
if component == '.' or component == '':
# 当前目录或空字符串,跳过
continue
elif component == '..':
# 上一级目录,如果栈不为空则弹出
if stack:
stack.pop()
else:
# 否则,将组件加入栈中
stack.append(component)
# 将栈中的组件重新组合为路径
return '/' + '/'.join(stack)
# 示例
print(simplifyPath("/a//b////c/d/./././..")) # 输出: "/a/b/c"
```
### JavaScript 示例代码
```javascript
function simplifyPath(path) {
const stack = [];
const components = path.trim('/').split('/');
for (let component of components) {
if (component === '.' || component === '') {
// 当前目录或空字符串,跳过
continue;
} else if (component === '..') {
// 上一级目录,如果栈不为空则弹出
if (stack.length > 0) {
stack.pop();
}
} else {
// 否则,将组件推入栈中
stack.push(component);
}
}
// 将栈中的组件重新组合为路径
return '/' + stack.join('/');
}
// 示例
console.log(simplifyPath("/a//b////c/d/./././..")); // 输出: "/a/b/c"
```
在这三个示例中,我们使用了栈(在 PHP 中为数组,在 Python 和 JavaScript 中为栈对象)来模拟路径的简化过程,以符合题目要求的路径简化规则。