3/3 OJ练习

给你一个长度为 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值,不然每次都要从新找很多测试用例就过不了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值