二、保證文件名唯一(Weekly Contest 194)

題目描述:
給你一個長度爲 n 的字符串數組 names 。你將會在文件系統中創建 n 個文件夾:在第 i 分鐘,新建名爲 names[i] 的文件夾。

由於兩個文件 不能 共享相同的文件名,因此如果新建文件夾使用的文件名已經被佔用,系統會以 (k) 的形式爲新文件夾的文件名添加後綴,其中 k 是能保證文件名唯一的 最小正整數 。

返回長度爲 n 的字符串數組,其中 ans[i] 是創建第 i 個文件夾時系統分配給該文件夾的實際名稱。

示例 1:

輸入:names = [“pes”,“fifa”,“gta”,“pes(2019)”]
輸出:[“pes”,“fifa”,“gta”,“pes(2019)”]
解釋:文件系統將會這樣創建文件名:
“pes” --> 之前未分配,仍爲 “pes”
“fifa” --> 之前未分配,仍爲 “fifa”
“gta” --> 之前未分配,仍爲 “gta”
“pes(2019)” --> 之前未分配,仍爲 “pes(2019)”
示例 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”
示例 3:

輸入:names = [“onepiece”,“onepiece(1)”,“onepiece(2)”,“onepiece(3)”,“onepiece”]
輸出:[“onepiece”,“onepiece(1)”,“onepiece(2)”,“onepiece(3)”,“onepiece(4)”]
解釋:當創建最後一個文件夾時,最小的正有效 k 爲 4 ,文件名變爲 “onepiece(4)”。
示例 4:

輸入:names = [“wano”,“wano”,“wano”,“wano”]
輸出:[“wano”,“wano(1)”,“wano(2)”,“wano(3)”]
解釋:每次創建文件夾 “wano” 時,只需增加後綴中 k 的值即可。
示例 5:

輸入:names = [“kaido”,“kaido(1)”,“kaido”,“kaido(1)”]
輸出:[“kaido”,“kaido(1)”,“kaido(2)”,“kaido(1)(1)”]
解釋:注意,如果含後綴文件名被佔用,那麼系統也會按規則在名稱後添加新的後綴 (k) 。

提示:

1 <= names.length <= 5 * 10^4
1 <= names[i].length <= 20
names[i] 由小寫英文字母、數字和/或圓括號組成。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/making-file-names-unique
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

這道題你得考慮一些技巧,首先就是
你得使用hashmap來存儲已經命名的文件,並且和對應的序號,其次就是你得注意的是
比如first和first(1)並不是重名的即可,也就是說你只需要注意他已經在數組中給你的文件可能出現重複即可
看代碼可能比較清晰些

class Solution {
    public String[] getFolderNames(String[] names) {
        Map<String,Integer> map = new HashMap<>();
        String result [] = new String[names.length];
        for (int i = 0; i < names.length; i++) {
//如果找不到,那麼直接命名,並且放入到map中存儲即可,次數爲1
            if(!map.containsKey(names[i])){
                map.put(names[i],1);
                result[i] = names[i];
                //如果找到了,需要注意的是,你命名的後綴可能已經被佔用了,比如[1,1(1),1],這樣第三個1就不是1(1)而是1(2)這點需要注意
            }else{
                int count = map.get(names[i]);
                while (map.containsKey(names[i] + "(" + count + ")")){
                    count ++;
                }
                result[i] = names[i] + "(" + count+")";
                map.put(result[i],1);
                map.put(names[i],count);
            }
        }
        return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章