通过万岁!!!
- 题目:给你一个表示路径的字符串,然后里面有…/、./、//和普通的路径然后找到他的简化路径。其中…/表示上一级、./表示本级、//表示本级别。简单的说就是这个路径是一个多次变化的路径,然后让我们找到直接到达的路径。然后给定的路径字符串path是由/开始的,要求返回的也是由、开始,并且最后没有/.
- 思路:我们就按照这个路径走一遍就行了,然后用一个东西存储一下就行了。假设我们用容器A存储,那么我们最后把每层的文件夹都放进去,然后访问上一级就是访问刚刚放进去的。芜湖,这不是栈么。而至于怎么找到每个文件夹,我们直接用/对字符串进行split不就行了。
- 技巧:
- 这里我们模拟了这个找路径的过程,也就是使用了一个栈。
- 最后我们需要注意的是,我们得到最终字符串的时候,需要出栈,而出栈是最后的文件夹,因此我们构造这个字符串,需要一点一点出栈,然后从前面加入到这个字符串中。
- 这里字符串还是不断变化的,我们使用StringBuilder字符串,效率应该回高一点。
伪代码
我们先对path进行分割成数组,需要注意,因为path的第一个是/,这样数组的第一个就是空
然后定义一个栈
for遍历数组,因为数组的第一个是空,因此我们遍历数组从1开始就可以了
这里有几种情况需要继续判断,所以使用switch
如果是"..",那就在能出栈的情况下出栈,然后break
如果是".",那么就不做任何处理
如果是"",也不做任何处理,然后break;这里跟上面的"."一块break即可,因此上面的不用break。是空的情况是因为有//的时候
其他情况,入栈即可
然后定义StringBuilder对象sb
首先判断栈是不是空,要是空的话,直接renturn "/"即可。
然后这里while遍历栈,条件是栈不为空
往sb的前面追加字符串"/"+栈内内容即可
最后将sb转成String并return。
java代码
class Solution {
public String simplifyPath(String path) {
String[] paths = path.split("/");
Stack<String> stack = new Stack<>();
for (int i = 1; i < paths.length; i++) {// 从1开始是因为path最开始是/,这样split以后,第一个是空
switch (paths[i]) {
case "..":
if (!stack.isEmpty())// 不是空就出栈
stack.pop();
break;
case ".":
case "":// 这是因为里面有可能出现//,双斜杠表示但斜杠
break;
default:
stack.push(paths[i]);
}
}
StringBuilder sb = new StringBuilder();
if (stack.isEmpty()) return "/";
while (!stack.isEmpty()) {// 这里必须是前插法
sb.insert(0, "/" + stack.pop());
}
return sb.toString();
}
}
- 总结:主要是跟栈联系上,这个题不麻烦的,情况也不是很多。