LeetCode - 71. Simplify Path

这道题和罗马数字转换一样,题目的求解方法与背景联系地非常强。基本上的一些规则是,如果遇到.或者“”,就直接跳过;如果遇到..就将上面的一个路径回退。所以根据上面的思想,我们首先用一个Stack存储结果路径中的元素,使用一个Set存储..,. 和“”这种需要跳过的特殊字符,然后将题目中给出的String以/逐个分割开来进行扫描,可能的情况如下:

如果遇到..且Stack不为空的话,那么回退Stack中的一个元素,如果为空则直接跳过;

如果遇到.和/的话则直接跳过;

如果遇到其他有意义的字符就加入到Stack里面;

扫描完所有的元素之后,这时Stack中存储了结果路径中的所有元素,只要将它们添加并且使用/逐个分割即可,代码如下:

public class Solution {
    public String simplifyPath(String path) {
        Deque<String> stack = new LinkedList<>();
        Set<String> skip = new HashSet<>(Arrays.asList("..", ".", ""));

        for(String dir : path.split("/")){
            if(dir.equals("..") && !stack.isEmpty()) stack.pop();
            else if(!skip.contains(dir)) stack.push(dir);
        }

        String result = "";
        for(String dir : stack) result = "/" + dir + result;
        return result.isEmpty() ? "/" : result;
    }
}


知识点:

1. 另外这道题目中还有一些非常值得学习的Java知识:

Deque<E>是Java中的一个接口,意思为double ended queue,它是一个线性的Collection,支持在两端插入和删除元素。因为Deque是一个接口,所以不能对它进行实例化,需要使用实现了Deque这个接口的类:ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList,它的一些方法如下图


2. Arrays.asList方法,返回一个固定大小的List<T>,而它是一个Collection,所以可以作为HashSet构造函数的参数使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值