leetcode71-简化路径

原题

以 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"

解法

思想

使用栈的思想来解决该问题,将给定的字符串使用"/"分割,会得到由空字符串、"."".."、目录名组成的字符串数组,然后根据它们的特点对元素进行入栈出栈等操作。

代码

class Solution {
    public String simplifyPath(String path) {
        StringBuilder sb = new StringBuilder();
        //因为最后要遍历栈,这里用ArrayList来模拟栈
        List<String> stack = new ArrayList<>();
        String[] dirs = path.split("/");
        for(String i:dirs){
            //空字符串和"."都表示当前目录
            if(i.equals("") || i.equals(".")) continue;
            //".."表示上一级目录,出栈一个元素
            if(i.equals("..")){
                if(stack.size()!=0) 
                    stack.remove(stack.size()-1);
            }
            //其他目录名入栈
            else stack.add(i); 
        }
        if(stack.size()==0) return "/";
        //通过"/"连接起来
        for(String i:stack){
            sb.append("/");
            sb.append(i);
        }
        return sb.toString();
    }
}
func simplifyPath(path string) string {
    paths := strings.Split(path, "/")
    var stack []string
    for _, path := range paths{
        if path == "."{
            continue
        } else if path == ".."{
            if len(stack) > 0{
                stack = stack[:len(stack) - 1]
            }
        } else if path != ""{
            stack = append(stack, path)
        }
    }
    return "/" + strings.Join(stack, "/")
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode71-%e7%ae%80%e5%8c%96%e8%b7%af%e5%be%84/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年1月23日 01:09
下一篇 2020年1月23日 18:22

相关推荐

  • leetcode235-二叉搜索树的最近公共祖先

    原题 给定一个二叉二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x …

    2020年1月17日
    0110
  • leetcode1431-拥有最多糖果的孩子(儿童节快乐!)

    原题 给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子,检查是否存在一种方案,将额…

    算法 2020年6月1日
    0310
  • leetcode57-插入区间

    原题 给出一个无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 示例 1: 输入: …

    算法 2020年5月12日
    0290
  • leetcode160-相交链表

    原题 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入: intersectVal = 8, listA = [4,1,…

    2019年12月14日
    090
  • 用一个栈实现另一个栈的排序

    原题(来源牛客网) 一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序? 解法 …

    算法 2020年4月20日
    02110
  • leetcode680-验证回文字符串II

    原题 给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca" 输出: True 解…

    算法 2020年5月19日
    0290
  • leetcode347-前K个高频元素

    原题 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例2: 输入: n…

    算法 2019年12月28日
    0170
  • leetcode2-两数相加

    原题 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回…

    算法 2019年12月17日
    080
  • leetcode380-常数时间插入、删除和获取随机元素

    原题 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。 insert(val):当元素 val 不存在时,向集合中插入该项。 remove(val):元素 v…

    2019年12月28日
    0110
  • 蓝桥杯试题-哈夫曼树

    原题 Description Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 给出一列数{pi}={p0, p1, …, pn-1},用这列…

    算法 2020年3月1日
    0250

发表回复

登录后才能评论