Skip to content

Commit 1595242

Browse files
committed
数组: unix路径简化
Change-Id: Ib2ddc00e00578786450f24454c1864b511bba4ad
1 parent 28c6c8c commit 1595242

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

go/leetcode/71.简化路径.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
* @lc app=leetcode.cn id=71 lang=golang
3+
*
4+
* [71] 简化路径
5+
*
6+
* https://leetcode-cn.com/problems/simplify-path/description/
7+
*
8+
* algorithms
9+
* Medium (37.36%)
10+
* Likes: 78
11+
* Dislikes: 0
12+
* Total Accepted: 18.8K
13+
* Total Submissions: 49.6K
14+
* Testcase Example: '"/home/"'
15+
*
16+
* 以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
17+
*
18+
* 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..)
19+
* 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
20+
*
21+
* 请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 /
22+
* 结尾。此外,规范路径必须是表示绝对路径的最短字符串。
23+
*
24+
*
25+
*
26+
* 示例 1:
27+
*
28+
* 输入:"/home/"
29+
* 输出:"/home"
30+
* 解释:注意,最后一个目录名后面没有斜杠。
31+
*
32+
*
33+
* 示例 2:
34+
*
35+
* 输入:"/../"
36+
* 输出:"/"
37+
* 解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
38+
*
39+
*
40+
* 示例 3:
41+
*
42+
* 输入:"/home//foo/"
43+
* 输出:"/home/foo"
44+
* 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
45+
*
46+
*
47+
* 示例 4:
48+
*
49+
* 输入:"/a/./b/../../c/"
50+
* 输出:"/c"
51+
*
52+
*
53+
* 示例 5:
54+
*
55+
* 输入:"/a/../../b/../c//.//"
56+
* 输出:"/c"
57+
*
58+
*
59+
* 示例 6:
60+
*
61+
* 输入:"/a//b////c/d//././/.."
62+
* 输出:"/a/b/c"
63+
*
64+
*/
65+
66+
import (
67+
"strings"
68+
)
69+
70+
// @lc code=start
71+
func simplifyPath(path string) string {
72+
pa := strings.Split(path, "/")
73+
ret := []string{pa[0]}
74+
for i := 1; i < len(pa); i++ {
75+
if pa[i] == "" || pa[i] == "." { // 跳过 /a//b = /a/b 跳过 /a/./b = /a/b
76+
continue
77+
}
78+
if pa[i] == ".." { // 回退一个 /a/b/../c = /a/c
79+
if len(ret) > 1 {
80+
ret = ret[0 : len(ret)-1]
81+
}
82+
continue
83+
}
84+
ret = append(ret, pa[i])
85+
}
86+
str := strings.Join(ret, "/")
87+
if str == "" {
88+
return "/"
89+
}
90+
// 删掉最后一个/
91+
if str[len(str)-1] == "/"[0] {
92+
str = str[0 : len(str)-1]
93+
}
94+
return str
95+
}
96+
// @lc code=end
97+

0 commit comments

Comments
 (0)