LeetCode-1233 删除子文件夹

感觉最近两天的每日一题都是场景模拟题,是不是春招来了先预热 ^ ^

题目描述

你是一位系统管理员,手里有一份文件夹列表folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。

如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下,那么 folder[i] 就是 folder[j] 的 子文件夹 。

文件夹的「路径」是由一个或多个按以下格式串联形成的字符串:'/' 后跟一个或者多个小写英文字母。

例如,"/leetcode""/leetcode/problems" 都是有效的路径,而空字符串和 "/" 不是。

示例
输入:folder = [“/a”,“/a/b”,“/c/d”,“/c/d/e”,“/c/f”]
输出:[“/a”,“/c/d”,“/c/f”]
输入:folder = [“/a”,“/a/b/c”,“/a/b/d”]
输出:[“/a”]

思路

一道较为简单的模拟题。我们可以先对folder数组进行排序,目的是为了让相同前缀的文件路径在一起。
再判断当前文件夹是否是结果集里文件夹的子文件夹:
如果是,继续遍历。
如果不是,将其加入结果集中。

代码

class Solution {
    public List<String> removeSubfolders(String[] folder) {
        // 对数组进行排序
        Arrays.sort(folder);
        // 初始化结果集
        List<String> result = new ArrayList<>();
        for (String f : folder) {
            // 当前文件夹不是结果集中文件夹的子文件夹
            if (result.isEmpty() || !f.startsWith(result.get(result.size() - 1) + "/")) {
                result.add(f);
            }
        }
        return result;
    }
}

一些注意的点:

!f.startsWith(result.get(result.size() - 1) + "/" 判断是否为前缀的这段代码中为什么要加上 "/"呢。这是因为如果不加"/",那么startsWith的判断将变成判断f 是否是以 result.get(result.size() - 1) 开头的字符串,也就是说,把"/"省略掉后,f的路径就变成了 result.get(result.size() - 1) 的子路径,并不是该路径的子文件夹,这与题目中的要求不符。

举个例子:假设 result 中存储了路径 "/a/b/c"f 的路径是 "/a/b/ce"。如果 startsWith 中不加"/",则 f.startsWith(result.get(result.size() - 1)) 会返回 true,认为"/a/b/ce""/a/b/c"的子文件夹,但实际上它们是同级的,因此需要在 startsWith 中加上 "/" 来保证逻辑符合预期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值