这是一道经典栈的应用题。
不知道为什么那么多差评。
这题一定要做熟。
我想提一点在这里,我还看到很多人在用Stack.
Java里面的Stack已经depreciate了,
官方文档里建议是用Deque。
所以最好使用Deque, 你当然也可以像stack 一样使用它。stack有的api,deque都有。
关于为什么不用Stack,请参考以下文档。
主要原因有几条
1。 Stack继承自Vector, 加了不必要的锁,降低了效率。
2。 Stack继承自Vector, 可以实现在数组的中间插入。这就不叫Stack了。
https://stackoverflow.com/questions/1386275/why-is-java-vector-and-stack-class-considered-obsolete-or-deprecated
好了,现在看代码。又用了我最爱的双指针。
public String simplifyPath(String path) {
Deque<String> deque = new ArrayDeque<>();
int slow = 0, fast = 0;
while (fast < path.length()) {
while (fast + 1 < path.length() && path.charAt(fast + 1) != '/') {
fast++;
}
String seg = path.substring(slow + 1, fast + 1);
if (seg.length() == 0 || seg.equals(".")) {
//do nothing
} else if (seg.equals("..")) {
if (!deque.isEmpty()) deque.pollLast();
} else {
deque.offerLast(seg);
}
slow = ++ fast;
}
StringBuilder sb = new StringBuilder();
if (deque.size() == 0) return "/";
while (!deque.isEmpty()) {
sb.append("/");
sb.append(deque.pollFirst());
}
return sb.toString();
}