第194场周赛
这次周赛比较惨,只做出了第一个题目。最终排名1700+
第一个题目比较简单,就是去模拟异或的过程即可。
class Solution
{
public:
int xorOperation(int n, int start)
{
vector<int> nums;
for(int i = 0;i < n;i++)
{
nums.push_back(start + 2 * i);
}
int ans = 0;
for(int i = 0;i < n;i++)
{
ans = ans ^ nums[i];
}
return ans;
}
};
第二个题目我一开始的想法是用暴力解法,写出代码之后发现超时了。
暴力解法的代码:
class Solution
{
public:
vector<string> getFolderNames(vector<string>& names)
{
vector<string> ans;
unordered_set<string> s;
for(int i = 0;i < names.size();i++)
{
const string str = names[i];
string temp = str;
int count = 1;
while(s.find(temp) != s.end())
{
temp = str + "(" + to_string(count) + ")";
count++;
}
s.insert(temp);
ans.push_back(temp);
}
return ans;
}
};
这个题目的优化思路还是比较好想的,用一个unordered_map
来记录文件名和文件名出现的次数,当查询到文件名已经在哈希表中时,不用从1开始逐渐递增,只要从unordered_map
的value
值开始递增。
思路比较好想,但是代码实现上,我总是写不出来,最后看了闫神的代码才写出来。
class Solution
{
public:
vector<string> getFolderNames(vector<string>& names)
{
unordered_set<string> hash;
unordered_map<string,int> cnt; //key 是文件名 value是出现次数
vector<string> ans;
for(auto str : names)
{
string suc;
int k = 0;
if(cnt.count(str))
{
k = cnt[str];
}
while(hash.count(str + suc))
{
k++;
suc = "(" + to_string(k) + ")";
}
cnt[str] = k;
hash.insert(str + suc);
ans.push_back(str + suc);
}
return ans;
}
};