【設計】B008_LC_保證文件名唯一(map 統計)

一、Problem

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

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

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

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

二、Solution

方法一:map

服了,這卡了半小時(超時),原因在 while 檢查 cur 的時候,沒有將 ns[i] 加入到 map 中,導致後面在遇到同樣的文件名時,需要從頭計算該文件名出現的次數,比如:

a,a,a,a,a,a,......,a

而如果在 while 中就將該文件名出現的次數累加並假如到 map 中,若以後再次遇到相同的字符,直接就可以得到次數,然後將 (x) 加到文件名的後面。

class Solution {
    public String[] getFolderNames(String[] ns) {
        Map<String, Integer> cnt = new HashMap<>();
        String[] ans = new String[ns.length];
        
        for (int i = 0; i < ns.length; i++) {
            if (!cnt.containsKey(ns[i])) {
                ans[i] = ns[i];
            } else {
                int c = cnt.get(ns[i]);
                String cur = ns[i] + "(" + c + ")";
                while (cnt.containsKey(cur)) {
                    cur = ns[i] + "(" + (++c) + ")";
                    cnt.put(ns[i], c);
                }
                ans[i] = cur;
            }
            cnt.put(ans[i], cnt.getOrDefault(ans[i], 0) + 1);
        }
        return ans;
    }
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章