步骤 1:理解题意
Unix 绝对路径按 / 切分后得到若干 token:
- 空串
""或"."→ 直接忽略 ".."→ 返回上一级(弹出栈顶,若栈空则不动)- 其他合法目录名 → 压栈
最后再把栈中目录用/拼起来,最前面补一个/即为简化结果。
边界:空栈时返回"/"。
步骤 2:写出暴力/朴素解法
直接 split("/") 后 for-loop 处理,用列表模拟栈,最后再 join,代码较长但思路直观。
步骤 3:寻找冗余与优化点
- 不必正则或多次字符串拼接,用
Deque<String>一次入栈出栈即可。 - 注意连续
/产生的空串 token。 - 时间 O(n),额外空间 O(n)(栈大小)。
步骤 4:给出最优"快刷"版本
java
public String simplifyPath(String path) {
Deque<String> stk = new ArrayDeque<>();
// 按 / 切分
for (String tok : path.split("/")) {
if (tok.isEmpty() || tok.equals(".")) continue;
if (tok.equals("..")) {
if (!stk.isEmpty()) stk.pollLast();
} else {
stk.offerLast(tok);
}
}
return "/" + String.join("/", stk);
}
- 时间:O(n)
- 空间:O(n)
- 可直接 copy 通过 LintCode 421。