题目背景
本文将讨论一道与操作系统路径归一化有关的问题,该问题来自 BerOS 文件系统 的设计。BerOS 是一个新型操作系统,其文件路径系统允许路径中的分隔符 /
重复出现。例如,以下路径被视为等价的:
/usr//local//nginx/sbin/
/usr/local/nginx///sbin
为了优化文件系统操作,我们需要将路径转化为一种标准化形式,即:
- 重复的
/
被合并为单个/
。 - 结尾处的多余
/
被移除(如果路径非根目录)。 - 保留路径最小的
/
数量。
输入输出格式
输入:
- 一行路径字符串,路径仅由小写字母、字符
/
组成。 - 路径始终以字符
/
开头。 - 路径长度不超过 100 个字符。
输出:
- 标准化后的路径。
示例:
输入 | 输出 |
---|---|
//usr//local//nginx/sbin | /usr/local/nginx/sbin |
/usr///local// | /usr/local |
Python 实现代码
以下是该问题的 Python 实现代码,完整地解决了路径归一化的需求:
def main():# 输入路径path = input().strip()output = ""flag = False# 遍历路径中的每个字符for char in path:if char != '/' or not flag: # 如果当前字符不是 '/' 或之前没有连续的 '/'output += charflag = (char == '/') # 记录当前是否遇到 '/'# 去除路径末尾多余的 '/'if flag and len(output) > 1:output = output[:-1]# 输出标准化路径print(output)if __name__ == "__main__":main()
代码解析
-
输入读取:
- 使用
input().strip()
读取用户输入并移除首尾多余空格。
- 使用
-
路径标准化逻辑:
- 遍历路径字符:
- 如果当前字符不是
/
或前一个字符不是/
,将字符加入结果字符串。 - 使用布尔变量
flag
跟踪前一个字符是否为/
。
- 如果当前字符不是
- 遍历路径字符:
-
末尾
/
处理:- 如果路径以
/
结尾且长度大于 1(非根路径),移除最后一个/
。
- 如果路径以
-
输出:
- 打印标准化后的路径。
测试结果
运行以下输入测试,程序表现正常,输出符合预期:
输入: //usr//local//nginx/sbin
输出: /usr/local/nginx/sbin
输入: /usr///local//
输出: /usr/local
算法复杂度分析
- 时间复杂度:O(n),其中 n 为路径字符串长度。程序仅遍历字符串一次。
- 空间复杂度:O(n),结果字符串需要额外存储空间。
总结
本文介绍了一个经典的路径归一化问题及其高效的 Python 实现。代码逻辑清晰、易于扩展,并在路径标准化领域具有实际应用价值。如果你对本文感兴趣,欢迎分享和讨论!