开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情
1487. 保证文件名唯一
给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。
由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新文件夹的文件名添加后缀,其中 k 是能保证文件名唯一的 最小正整数 。
返回长度为 n 的字符串数组,其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。
示例 2:
输入: names = ["gta","gta(1)","gta","avalon"]
输出: ["gta","gta(1)","gta(2)","avalon"]
解释: 文件系统将会这样创建文件名:
"gta" --> 之前未分配,仍为 "gta"
"gta(1)" --> 之前未分配,仍为 "gta(1)"
"gta" --> 文件名被占用,系统为该名称添加后缀 (k),由于 "gta(1)" 也被占用,所以 k = 2 。实际创建的文件名为 "gta(2)" 。
"avalon" --> 之前未分配,仍为 "avalon"
思路
一般来说,我们在分配文件名之前,需要检查该文件名是否存在,如果存在,则添加文件名后缀数字 (1),若依然存在此文件名,则增加数字,直到无重复数字停止。
我们在判断时,需要进行两种判断,第一种是判断原文件名是否有重复,第二种是判断添加后缀数字的文件名是否有重复。在进行第二种判断时,可以使用 map 来存储文件名已经重复的次数,这样的话就可以只判断一次就能得到未被占用的后缀数字。
在每次执行后,需要在 map 中存入该文件名的重复次数。
题解
class Solution {
public String[] getFolderNames(String[] names) {
Map<String, Integer> map = new HashMap<>();
int n = names.length;
String[] ans = new String[n];
for(int i = 0; i < n; i++) {
String name = names[i];
while(map.containsKey(name)) {
int index = map.get(names[i]);
name = names[i] + String.format("(%s)", ++index);
map.put(names[i], index);
}
map.put(name, 0);
ans[i] = name;
}
return ans;
}
}
如果你有其他的思路或者更好的解法,亦或者你发现了文章出现了错误或有不足,欢迎在评论区和我交流,我看到了一定会回复。
写文章不易,如果你觉得文章对你有帮助,麻烦点一下点赞、收藏,你的支持是我写文章的最大动力!