题目:
给定一个文档 (Unix-style) 的完全路径,请进行路径简化。
例如,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
边界情况:
- 你是否考虑了 路径 =
"/../"
的情况?
在这种情况下,你需返回"/"
。 - 此外,路径中也可能包含多个斜杠
'/'
,如"/home//foo/"
。
在这种情况下,你可忽略多余的斜杠,返回"/home/foo"
。
分析:
栈的应用,先把所给的路径按“/”分割成一个strings数组,数组中可能会存在“.”“..”"" "xxx", 根据不同的情况来做入栈出栈操作。
遍历strings数组,如果当前字符串 == “.”则无操作,不入栈不出栈;当字符串 == “..”时要将栈顶元素弹出,这里需要注意到栈为空的时候,所以之前先加一个判断,栈是否为空;当字符串 == “”时,也就是什么都没有,不用操作;当字符串 == “xxx”也就是里面是文件名时候,要先将“/”入栈,再将当前字符串入栈。
代码:
测试代码:
import java.util.Stack;
public class LC71 {
static String path = "/a/./b/../..//c/";
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
String[] strings = path.split("/");
for (int i = 0; i < strings.length; i++)
if(strings[i].equals(".")){//不做操作
continue;
}else if (strings[i].equals("..")){//删除前一路径
if(!stack.isEmpty()) {
stack.pop();//删除前一路径名
stack.pop();//删除路径名前的“/”
}
}else if(strings[i].equals("")){//无操作
continue;
}else {//路径入栈
stack.add("/");//“/”先入栈
stack.add(strings[i]);//文件名入栈
}
if (stack.isEmpty())
stack.add("/");
String string = "";
for (int i = 0; i < stack.size(); i++)
string += stack.get(i);
System.out.println(string);
}
}
提交代码:
class Solution {
public String simplifyPath(String path) {
Stack<String> stack = new Stack<>();
String[] strings = path.split("/");
for (int i = 0; i < strings.length; i++)
if(strings[i].equals(".")){
continue;
}else if (strings[i].equals("..")){
if(!stack.isEmpty()) {
stack.pop();
stack.pop();
}
}else if(strings[i].equals("")){
continue;
}else {
stack.add("/");
stack.add(strings[i]);
}
if (stack.isEmpty())
stack.add("/");
String string = "";
for (int i = 0; i < stack.size(); i++) {
string += stack.get(i);
}
return string;
}
}