算法记录
LeetCode 题目:
根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
说明
一、题目
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);
两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。
对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
-
始终以斜杠 '/' 开头。
-
两个目录名之间必须只有一个斜杠 '/' 。
-
最后一个目录名(如果存在)不能 以 '/' 结尾。
-
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
-
返回简化后得到的 规范路径 。
二、分析
- 根据题意可知,就是一个简单的命令匹配问题,我们可以从前往后开始遍历整个命令集合,而标识符是由
/进行分割的。 - 如果遇见了一个
.则表示是在当前目录,也就是维持已有的解析路径数据不变。 - 如果遇见了一个
..则表示需要退回到上一级目录,也就是需要将最近保存的路径解析删除掉。 - 其余的只要满足路径的定义就直接进行解析添加。
- 也就是一个后进先出的概念,使用栈来作为中间状态的存储结构最合适,但最后还要按序将数据写出,用栈不好遍历,于是使用双端队列来存储数据。
class Solution {
public String simplifyPath(String path) {
String[] names = path.split("/");
Deque<String> queue = new ArrayDeque();
for(String name : names) {
if("..".equals(name)) {
if(!queue.isEmpty()) queue.pollLast();
}
else if(!".".equals(name) && name.length() > 0) queue.offerLast(name);
}
StringBuilder builder = new StringBuilder();
if(queue.isEmpty()) {
builder.append("/");
} else {
while(!queue.isEmpty()) builder.append("/" + queue.pollFirst());
}
return builder.toString();
}
}
总结
注意解析题目所讲的含义。