LeetCode - 71 - 简化路径 - java - 细喔

x33g5p2x  于2022-01-07 转载在 Java  
字(1.9k)|赞(0)|评价(0)|浏览(195)

题目

题目解析

题目大意:给我们一个文件目录路径。

就像上图上所示,给我们一个这样的文件路径,当然题目给的,还多了两个东西 “.” 和 “. .”,题目解释的也很清楚,一个点(.)表示当前目录本身;此外,两个点 ( . . ) 表示将目录切换到上一级(指向父目录)。
至此,我们明白了 题目提出的 文件路径。
接下就是题目的目的了!
题目要求我们删除 删除 “.” 和 “. .”,另外 “/”,返回值必须以它开头,且如果在存在 多目录的情况下,要用 “/” 隔开。还有,如果 只有一个文件名/一个目录 的情况下,例如 /home/,此时,只保留前面的 “/”。
当然,还有一个附加条件: 简化后的目录名顺序不变。(示例正在疯狂暗示你!)

解题思维 与 实现细节 - 利用 栈 和 deque双端队列来完成这题。

首先,我们先将题目所给出 字符串,以字符串"/" 进行分割,分割成一个字符串数组。另外先创建好 双端队列的类。

下面这张图,只是给你做参考用的,目的是是让你明白。stack 其实是是现在 deque 接口。
这也是为什么,这题能利用 栈 来解决问题。
另外,我们也可以得出一个结论: ArrayDeque类 也实现了 deque,不然,deque 是不用引用 ArrayDeque类的对象的。

然后我们就去遍历 字符串数组 str,将符合条件的数据放入栈中。

这里我们使用的 foreach 增强for循环。因为我们不关注 下标,我们只关注其值,
因为,我们创建一个栈,我们想要将 符合条件的数据放入栈中。所以我们用不到下标。

接下来就是将合适的数据,放入栈中
那么,问题来了:什么数据符合条件
首先,我们的数组str 元素中没有 “/”,因为我们是“/” 作为分割线, “/” 并不会当成数组元素存储起来。
所以,数组str中你那个的数据 就剩 “.” 、“. .”、文件名(字母和数字)。
再加上前面的题目分析:我们明白 “.” 和 “. .” 是不能出现的,所以这两个数据,不在 “合适”范围里。

还有一个细节来自于实例4:

我们都知道一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录)【题目解释】。
现在,你在看这题示例4: 文件 c 就是 就是 a 和 b 的父类目录。【a 与 b 属于同一级目录,都在父类目录下】
但是,返回结果:只有 父级目录。
这说明什么?在 数组 str中 遇到“. .”时,前面我们放入 目录名 要被删除,为后面的父类目录,做准备。
那么,可能有人产生疑问: 那同级目录这么快处理?

根据示例三;: 当然是 让它们都活着。
而且还有一个小细节:中间两个斜杠中间存在一个 字符串""【即:字符串长度为0】。
这是因为 我们利用 “/” 进行分割,产生的结果。将其作为 数组 str 的一个元素存储起来。
但是呢!由结果来看,一样也需要删除。不留着

该部分代码实现

代码细节

接下来,就是取出

创建一个 StringBuilder ,来将讲栈内的信息存储。

你也可以将其理解为 一个信息中转站,因为题目要求返回值为 String。最后只需要将其类型转换就行了。
至于为什么不直接使用 String,因为String 不像 StringBuilder 那样灵活。
可以拿到一个数据,我就存储一个(append)

代码细节

最后附上代码

class Solution {
    public String simplifyPath(String path) {
        String[] str = path.split("/");
        Deque<String> stack  = new ArrayDeque<>();
        for(String name: str){
            if("..".equals(name)){//如果遇到 ".."
                if(!stack.isEmpty()){// 前提是 栈不为空。要不然,下面的操作会抛出异常。【另外:栈为空,你能删除什么?】
                    stack.pollLast();// 删除 栈底 数据
                }
            }else if(name.length() > 0 && !".".equals(name)){// 长度为零的字符串 和 "." 不作为存储数据
                stack.offerLast(name);// 将符合条件的数据,放入栈底
            }
        }
        StringBuilder sb = new StringBuilder();
        if(stack.isEmpty()){
            sb.append("/");
        }else{
            while(!stack.isEmpty()){
                sb.append("/");
                sb.append(stack.pollFirst());
            }
        }
        return sb.toString();// 类型转换为 String 类型
    }
}

相关文章