题目描述
中文
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者
都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结
尾。此外,规范路径必须是表示绝对路径的最短字符串。
英文
Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the
canonical path.
In a UNIX-style file system, a period . refers to the current directory. Furthermore, a double
period .. moves the directory up a level. For more information, see: Absolute path vs relative path
in Linux/Unix
Note that the returned canonical path must always begin with a slash /, and there must be only a
single slash / between two directory names. The last directory name (if it exists) must not end with
a trailing /. Also, the canonical path must be the shortest string representing the absolute path.
示例1
输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
示例2
输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例3
输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例4
输入:"/a/./b/../../c/"
输出:"/c"
示例5
输入:"/a/../../b/../c//.//"
输出:"/c"
示例6
输入:"/a//bc/d//././/.."
输出:"/a/b/c"
思路分析
1.好吧,我现在也没什么思路...可不可以尝试用暴力的方法做呢?暴力+if判断是否可行呢?我们来试一下。
class Solution {
public String simplifyPath(String path) {
String[] temp = path.split("\\/"); //用将字符串切割
List<String> list = new ArrayList<String>(); //存放绝对路径目录
for(String s:temp){
if(s.length() != 0){
if(s.equals("..")){ //如果是返回上层 且可以返回
if(list.size() > 0){
list.remove(list.size()-1);
}
else{
continue;
}
}
else if(s.equals(".")){
continue;
}
else{
list.add(s);
}
}
}
String res = new String();
for(String s:list){
res = res + "/" + s;
}
if(res.length() == 0) //如果最后路径为空,返回根目录
res = "/";
return res;
}
}
- 很明显,是可以的,解决过程就是先将字符串以"/"切割开,然后进行逻辑判断,最后拼接路径就可以解决了。现在让我们用python3再写一次。
class Solution:
def simplifyPath(self, path: str) -> str:
strings = path.split("/")
paths = []
for string in strings:
if len(string) != 0:
if string == "..":
if len(paths) > 0:
del paths[len(paths) - 1]
else:
continue
elif string == '.':
continue
else:
paths.append(string)
res = ""
for path in paths:
res = res + "/" + path
if len(res) == 0:
res = "/"
return res
- 但是有没有更为聪明的方法呢?emmm,我暂时想不到,咱们来看下别人的代码。
- 额。好吧,好像大家思路都一样,只不过是用栈来做的,打扰了,今天就到这里。