一、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;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,