栈
class Solution {
public String simplifyPath(String path) {
// 创建一个栈,用于存储路径中的目录名
Stack<String> st = new Stack<>();
// 对路径字符串进行分割,得到每一部分
for(String i : path.split("/")){
// 如果当前部分是 "..",且栈不为空
if(i.equals("..") && !st.isEmpty()){
// 则将当前部分压入栈中(即进入新的目录)
st.pop();
}
// 如果当前部分既不是 ".." 也不是 ".",且不为空
else if(!i.equals("..") && !i.equals(".") && !i.equals("")){
// 则将当前部分压入栈中(即进入新的目录)
st.push(i);
}
}
// 创建一个StringBuilder对象,用于构建简化后的路径
StringBuilder sb = new StringBuilder();
// 遍历栈中的元素,将它们拼接成路径
for(String a : st){
sb.append("/");
sb.append(a);
}
// 如果构建的路径长度为0,说明路径为根目录,返回"/"
// 否则返回构建好的路径字符串
return sb.length() == 0 ? "/" : sb.toString();
}
}
疑问?为什么输出sb不需要reverse
由于 StringBuilder是一种可变的字符序列,它的特点是可以在末尾追加字符,而不需要像数组那样进行复杂的逆序操作。当我们从栈中取出元素并追加到 sb 时,它们自然地按照栈的顺序(后进先出)被添加到路径的开头。因此,我们不需要对 sb 进行反转操作。
例如,如果栈 st 的元素顺序是 [“dir1”, “dir2”, “dir3”],那么在遍历栈并将元素追加到 sb 时,sb的内容将依次是 “/dir1/dir2/dir3”,这正是我们想要的结果。
简而言之,由于 StringBuilder 的特性以及栈的顺序,我们不需要额外的反转操作来得到正确的路径字符串。