LeetCode-生命游戏

227 阅读2分钟

算法记录

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();
    }
}

总结

注意解析题目所讲的含义。