Leetcode 71. Simplify Path ⭐
12 Jul 2024leetcode
medium
array
leetcode-top-interview
Leetcode Top Interview 150 的其中一題
題目描述
Given an absolute path for a Unix-style file system, which begins with a slash '/'
, transform this path into its simplified canonical path.
In Unix-style file system context, a single period '.'
signifies the current directory, a double period ".."
denotes moving up one directory level, and multiple slashes such as "//"
are interpreted as a single slash. In this problem, treat sequences of periods not covered by the previous rules (like "..."
) as valid names for files or directories.
The simplified canonical path should adhere to the following rules:
It must start with a single slash '/'
.
Directories within the path should be separated by only one slash '/'
.
It should not end with a slash '/'
, unless it’s the root directory.
It should exclude any single or double periods used to denote current or parent directories.
Return the new path.
範例
Example 1:
Input: path = "/home/"
Output: "/home"
Explanation:
The trailing slash should be removed.
Example 2:
Input: path = "/home//foo/"
Output: "/home/foo"
Explanation:
Multiple consecutive slashes are replaced by a single one.
Example 3:
Input: path = "/../"
Output: "/"
Explanation:
Going one level up from the root directory is not possible.
Constraints:
- 1 <= path.length <= 3000
- path consists of English letters, digits, period
'.'
, slash'/'
or'_'
. - path is a valid absolute Unix path.
解法
func simplifyPath(path string) string {
if len(path) == 1 { return path }
folders := make([]string, 0)
path += "/"
bytes := make([]byte, 0)
for i:=1; i<len(path); i++ {
if path[i] != '/' {
bytes = append(bytes, path[i])
continue
}
if len(bytes) == 0 { continue }
if len(bytes) == 1 && bytes[0] == '.' {
bytes = []byte{}
continue
}
if len(bytes) == 2 && bytes[0] == '.' && bytes[1]=='.' {
if len(folders) > 0 { folders = folders[:len(folders) - 1] }
bytes = []byte{}
continue
}
folders = append(folders, string(bytes))
bytes = []byte{}
}
res := ""
for _, s := range folders {
res += "/"
res += s
}
if len(res) == 0 { return "/"}
return res
}