题目
给出一个文件的绝对路径,要求将其简化。举个例子,路径是“/home/”,简化后为“/home”,路径是“/a/./b/../../c/”,简化后为“/c”
知识点
- “.”代表当前路径。比如“/a/.”实际上就是“/a”,无论输入多少个“.”都返回当前目录
- “..”代表上一级目录。比如“a/b/..”实际上就是“/a”,也就是说先进入“a”目录,再进入其下的“b”目录,再返回“b”目录的上一层,也就是“a”目录
思路:
1)首先输入一个String,代表路径,输出要求也是String,同样代表路径
2)可以把输入的字符串根据“/”进行拆分,比如:“/a/b/./../d/”被拆分为一个String数组["a","b",".","..","d"]
3)建立一个栈,然后遍历拆分后的String数组,对于一般的String,直接将其插入栈中,对于“..”进行pop操作,其它情况不做处理
算法实现
func simplifyPath(path: String) -> String {
var pathStack = [String]() // 使用数组来实现栈的功能
let paths = path.components(separatedBy: "/") // 拆分原路径
for path in paths {
guard path != "." else { // 对于.直接跳过
continue
}
if path == ".." { // 对于..执行pop操作
if pathStack.count > 0 {
pathStack.removeLast()
}
} else if path != "" {
pathStack.append(path)
}
}
// 将栈中的内容转化为优化后的内容
let result = pathStack.reduce("") { (total, dir) in
return "\(total)/\(dir)"
}
// 空路径的结果是“/”
return result.isEmpty ? "/": result
}