题目描述
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.
)表示当前目录本身;此外,两个点 (..
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
请注意,返回的规范路径必须始终以斜杠 /
开头,并且两个目录名之间必须只有一个斜杠 /
。最后一个目录名(如果存在)不能以 /
结尾。此外,规范路径必须是表示绝对路径的最短字符串。
示例 1:
1 | 输入:"/home/" |
示例 2:
1 | 输入:"/../" |
示例 3:
1 | 输入:"/home//foo/" |
示例 4:
1 | 输入:"/a/./b/../../c/" |
示例 5:
1 | 输入:"/a/../../b/../c//.//" |
示例 6:
1 | 输入:"/a//b////c/d//././/.." |
题解
算法描述
- 字符串遍历、栈的应用
- 字符串切割、栈的应用
个人分析
法一:
- 逐个遍历字符串
- 遇到
.
不变 - 遇到
..
出栈 - 遇到
/
或其他字符时进栈
这是我第一次想出来的算法,后来遇到了这个测试用例:"/..."
,其期望答案居然还是:"/..."
。靠,我太难了!😥看了题解之后,发现C语言也有字符串切割的函数,就在string.h
这个库里,我心一横,换方法了!
法二:
- 使用
strtok()
函数,将字符串进行切割 - 因为每次切割返回的都是指针,所以我声明了一个指针数组
- 将切割出的子字符串的指针压入指针数组中
- 然后遍历指针数组
- 组合出最终的字符串
C代码
法一:
1 | char *simplifyPath(char *path) |
法二:
1 | /* |
代码写的稀烂,枯了😥
Python代码
1 | class Solution: |
不是我写的,真™优美,凎!
PS
使用了新的库函数:strtok()
1 | char *strtok(char *__restrict__ _Str, const char *__restrict__ _Delim) |
- char *restrict _Str: 待切割的字符串
- const char *restrict _Delim:包含分隔符的 C 字符串
使用strtok()
:
菜鸟教程
1 |
|