感觉最近两天的每日一题都是场景模拟题,是不是春招来了先预热 ^ ^
题目描述
你是一位系统管理员,手里有一份文件夹列表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
中加上 "/"
来保证逻辑符合预期。