給你一個長度爲 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]
由小寫英文字母、數字和/或圓括號組成。
class Solution {
public:
vector<string> getFolderNames(vector<string>& names) {
unordered_map<string,int>m;
m.reserve(50005);
vector<string>ans;
char cn[6];
for(int i=0;i<names.size();i++)
{
string s=names[i],s1;
if(m[s]==0)
{
ans.push_back(s);
m[s]=1;
continue;
}
for(int i=m[s];i<50005;i++)
{
sprintf(cn,"%d",i);
s1=s+"("+cn+")";
if(m[s1]==0)
{
ans.push_back(s1);
m[s]=i+1;
m[s1]=1;
break;
}
}
}
return ans;
}
};
PS:
我WA的用例:
["kaido","kaido(1)","kaido","kaido(1)","kaido(2)"]
["kaido","kaido(1)","kaido(2)","kaido(1)(1)","kaido(2)(1)"]
修改代碼:
s和s1都要存入map,改完AC