给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。
由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新文件夹的文件名添加后缀,其中 k 是能保证文件名唯一的 最小正整数 。
返回长度为 n 的字符串数组,其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称
示例 1:
输入:names = ["pes","fifa","gta","pes(2019)"]
输出:["pes","fifa","gta","pes(2019)"]
示例 2:
输入:names = ["gta","gta(1)","gta","avalon"]
输出:["gta","gta(1)","gta(2)","avalon"]
思路:遍历整个names数组,取每一个值,建立哈希数组和vector<string>存储,如果不在哈希数组中,那就直接插入哈希数组,记录value为1,并且将这个值插入vector中,如果在哈希数组中存在,那就由这个存在值的value和这个值建立一个新的值(由一个函数提供这个功能),然后检查哈希表中是否存在新值,k++一直构建并检查,最后k要记录到原来的Key中,这个新值也要插入vector中,并且哈希表中这个值的value=1,最后遍历完,返回vector<string>
class Solution {
public:
string& makefilename(string name,int v)
{
return name=name+'('+to_string(v)+')';//这里不可以写出name=name+'('+to_string+')',在参数为引用的情况下
}
vector<string> getFolderNames(vector<string>& names) {
unordered_map<string, int> index;
vector<string> res;
for(auto &name:names)
{
if(index.find(name)==index.end())//如果文件不存在,就插入文件到索引和返回数组中
{
res.push_back(name);
index[name]=1;//这个value就是为了构造下一次插入的同名文件
}
else
{//文件存在,就构造一个新的文件
int v=index[name];//获取value,比k小的都是已经存在的
string filename;
while(index.count(filename=makefilename(name,v)))
v++;
index[filename]=1;
res.push_back(filename);
index[name]=v+1;
}
}
return res;
}
};
//必须把vv记下来,不然每次要重新遍历
//和gta(1)相同的话记录为gta(1)(1)而不是gta(2)
本题考查哈希表的使用,要对unordered_map的接口熟悉,并且要记录下每次插入后的索引的v值,不然每次都要从新找很多测试用例就过不了