继续打卡算法题,今天学习的是LeetCode71题简化路径,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
经常使用linux系统命令的同学,解决这个题目应该不难,我们需要理解几个路径切换命令:
.
表示当前目录,这种情况我们在简化路径的时候其实是可以忽略
这种命令。 比如 /home/./ 恒等于 /home
..
表示跳转到上一层目录,/home/d/../ 恒等于 /home
有没有发现规律?我们遇到了..
命令的时候,需要把上一个路径名忽略。比如下面的路径切换
这样我们在遍历元素的路径的时候,通过/
分隔,按上面的规律分别处理.
和..
命令,处理..
命令需要对上一个命令进行操作,我们这种情况可以借助栈的后进先出
特性解决,将命令通过栈来存储。
本题解题技巧
1、通过栈特性,解决..
命令需要移除上一个命令的情况
编码解决
class Solution {
public String simplifyPath(String path) {
String[] names = path.split("/");
Deque<String> stack = new ArrayDeque<String>();
for(String name : names) {
if(name.equals("..")) {
stack.poll();
} else if(name.length()>0 && !name.equals(".")){
stack.push(name);
}
}
String result = "/";
while(!stack.isEmpty()) {
String r = stack.pollLast();
result += stack.isEmpty() ? r : r + "/";
}
return result;
}
}
总结
1、栈的后进先出的特性,对命令操作的场景非常实用,命令一层一层切进入,需要一层一层切出来