每日一题——保证文件名唯一

156 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

如果你有其他的思路或者更好的解法,亦或者你发现了文章出现了错误或有不足,欢迎在评论区和我交流,我看到了一定会回复。

写文章不易,如果你觉得文章对你有帮助,麻烦点一下点赞、收藏,你的支持是我写文章的最大动力!