专栏首页健程之道力扣71——简化路径

力扣71——简化路径

原题

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

示例 1:

输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。

示例 2:

输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。

示例 3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:

输入:"/a/./b/../../c/"
输出:"/c"

示例 5:

输入:"/a/../../b/../c//.//"
输出:"/c"

示例 6:

输入:"/a//b////c/d//././/.."
输出:"/a/b/c"

原题url:https://leetcode-cn.com/problems/simplify-path/

解法

看起也不难,但一开始我拿到的时候也是无从下手。

利用栈

看到..的逻辑就特别容易让人想到后退,而记录后退最方便的数据结构应该就是了。至于.就可以想象成可以忽略的内容,而/则可以作为分隔符了,来看看代码:

class Solution {
    public String simplifyPath(String path) {
        // 存储路径
        Stack<String> stack = new Stack<>();

                // 分隔
        String[] array = path.split("/");
        for (String str : array) {
                        // 忽略
            if (str.equals("") || str.equals(".")) {
                continue;
            }

                        // 后退
            if (str.equals("..")) {
                stack.pop();
                continue;
            }

                        // 需要存储的内容
            stack.push(str);
        }

        StringBuilder sb = new StringBuilder();
        for (String str : stack) {
            sb.append("/").append(str);
        }
                // 如果内容为空,则需要输出"/"
        if (sb.length() == 0) {
            sb.append("/");
        }
        return sb.toString();
    }
}

看起来很美好,提交之后报错了。说是stack.push(str);这行抛出了异常java.util.EmptyStackException,确实,如果栈为空,依旧还是需要在最顶层的(看来还是没有把问题想全面)。让我们来优化一下代码:

class Solution {
    public String simplifyPath(String path) {
        // 存储路径
        Stack<String> stack = new Stack<>();

                // 分隔
        String[] array = path.split("/");
        for (String str : array) {
                        // 忽略
            if (str.equals("") || str.equals(".")) {
                continue;
            }

                        // 后退
            if (str.equals("..")) {
                            // 判断是否为空,不为空,才需要回退
                if (!stack.empty()) {
                    stack.pop();
                }
                                // 无论stack空不空,都需要结束
                continue;
            }

            stack.push(str);
        }

        StringBuilder sb = new StringBuilder();
        for (String str : stack) {
            sb.append("/").append(str);
        }
        if (sb.length() == 0) {
            sb.append("/");
        }
        return sb.toString();
    }
}

OK,通过了,执行用时:6ms,内存消耗:36.2MB

总结

以上就是这道题目我的解答过程了,不知道大家是否理解了。因为之前已经刷了一些题目了,所以会把这些解题过程都补上去,也当做复习了。我刷题都是选 medium 的,所以不会很难,主要我看外企的面试大多也是以这样的题目为主,刷 hard 的题目确实感觉太费脑子,打击积极性。希望能与大家共同进步。

有兴趣的话可以访问我的博客或者关注我的公众号、头条号,说不定会有意外的惊喜。

https://death00.github.io/

本文分享自微信公众号 - 健程之道(JianJianCoder),作者:健健壮

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 力扣77——组合

    原题url:https://leetcode-cn.com/problems/combinations/

    健程之道
  • 力扣73——矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

    健程之道
  • 力扣227——227. 基本计算器 II

    字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。整数除法仅保留整数部分。

    健程之道
  • LeetCode - 反转字符串&字符串转换整数

    2020年的第一天,必须更新一条公众号,证明自己还在努力刷题(几周写一题),努力写公众号中。

    晓痴
  • js实现数字每三位加逗号的方法

    山河木马
  • 聊聊RocketMQTransactionAnnotationProcessor

    本文主要研究一下RocketMQTransactionAnnotationProcessor

    codecraft
  • 聊聊RocketMQTransactionAnnotationProcessor

    本文主要研究一下RocketMQTransactionAnnotationProcessor

    codecraft
  • [Leetcode][python]Spiral Matrix/Spiral Matrix II/螺旋矩阵/螺旋矩阵 II

    输入: matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] 输出: [1, 2, 3, 6, 9, 8, 7, 4, ...

    后端技术漫谈
  • Android 丢帧原理以及解决方案

    开发中的卡顿我想没跟人都遇到过,之前也是搜博客看看怎么个解决办法,没有认真研究过,今天我打算跟大家聊一聊。

    Android架构
  • SpringIOC源码解析(基于注解)

    本文会基于注解的方向分析SpringIOC模块的整体流程,在阅读本篇文章之前建议您先阅读基于XML分析的两篇文章: SpringIOC源码解析(上),Sprin...

    Java学习录

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动