题目描述#

给定一个 Unix 风格的绝对路径 path,要求把它转换成规范路径。

规范路径需要满足:以 / 开头,目录之间只有一个 /,末尾不能带多余的 /,并且结果中不能保留 ... 这样的特殊目录标记。

思路#

这道题也适合用栈来做,因为路径的处理过程本质上就是“进入一个目录”和“回到上一级目录”。

先用 strings.Split(paths, "/") 按斜杠拆分路径。这样连续的多个 / 会被拆出空字符串,正好可以在遍历时直接跳过。遍历每一段时,如果当前片段是空串或者 .,说明它对路径没有实际影响,继续往后处理即可。

如果当前片段不是 ..,那它就是一个有效目录名,直接压入栈中。这样栈里始终保存的是当前规范路径上从左到右的目录顺序。

如果当前片段是 ..,含义是回到上一级目录。这时只需要判断栈是否为空:如果栈里还有目录,就弹出栈顶;如果栈已经为空,说明当前已经在根目录,再往上也还是根目录,不需要做额外处理。

最后把栈中的目录用 / 拼接起来,并在最前面补上根目录的 /,就得到了最终的规范路径。

这个做法的时间复杂度是 O(n),空间复杂度是 O(n),其中 n 是字符串长度。

代码#

import "strings"

func simplifyPath(paths string) string {
	path := strings.Split(paths, "/")
	stack := []string{}
	for _, s := range path {
		if s == "" || s == "." {
			continue
		}
		if s != ".." {
			stack = append(stack, s)
		} else if len(stack) > 0 {
			stack = stack[:len(stack)-1]
		}
	}
	return "/" + strings.Join(stack, "/")
}
本站总访问量  ·  访客数
你的IP 获取中…