1,题目要求
英文叙述非常的不明确,直接截图来阐释。前面的数字可以看做出现的个数。问题要求统计各个域名出现的次数。
2,题目思路
对于统计数目类型的问题,在python中的话首先想到的就是字典,而在C++中,想到的便是和字典类似的map容器。这种容器在前面也有介绍过,其他的博客对map和unordered_map也有很详细的介绍,这里便不再赘述。
另外一点,便是如何得到不同长度的域名。举个例子,对于900 google.mail.com,它所对应有:google.mail.com,mail.com,com这三个域名,每个出现次数都是900,将域名设为key value,出现次数设为mapped value,便可以很方便的得到结果。获取域名的方式,可以利用从后往前的遍历,遇到“.”便将其记录到设定的map中去。
在实现程序找那个还有一些其他的编程技巧。
3,程序源码
class Solution {
public:
vector<string> subdomainVisits(vector<string>& cpdomains) {
unordered_map<string, int> domainRecord;
vector<string> resDomain;
for(auto domain : cpdomains)
{
int i = domain.find(" "); //找到空格所在的索引
int num = stoi(domain.substr(0,i)); //将出现次数的string转换为int,用到了stoi方法
string eachDomain = domain.substr(i+1, domain.size()-i-1);
for(int i = eachDomain.size()-1; i>=0; i--)
{
if(eachDomain[i]=='.')
{
domainRecord[eachDomain.substr(i+1,eachDomain.size()-i-1)] += num;
}
else if(i == 0)
{
domainRecord[eachDomain.substr(0,eachDomain.size())] += num;
}
}
}
for(auto domain: domainRecord)
{
resDomain.push_back(to_string(domain.second)+" "+domain.first);
}
return resDomain;
}
};
首先,要说的是,个人感觉在写程序的过程中未必就见得程序写的越短越好。当然在保证功能的前提下,去掉无用的冗余代码自然是有必要的。但是有的时候为了保证代码的可读性,还是将一些必要的逻辑和信息写出来会比较好吧。
1, str.find(” “)
string中 find()的应用 (rfind() 类似,只是从反向查找)
原型如下:
(1)size_t find (const string& str, size_t pos = 0) const; //查找对象–string类对象
(2)size_t find (const char* s, size_t pos = 0) const; //查找对象–字符串
(3)size_t find (const char* s, size_t pos, size_t n) const; //查找对象–字符串的前n个字符
(4)size_t find (char c, size_t pos = 0) const; //查找对象–字符
结果:
找到 – 返回 第一个字符的索引
没找到–返回 string::npos
在程序中,即找到空格对应的索引值(因为str中只有一个空格,因此也就是第一个空格的索引)。
2, str.substr(index, length)
获取字符串的子串的一种方式。
其中index是开始获取的索引值,length表示所要获取的子字符串的长度。
3,unordered_map
unordered_map<type1, type2> mapName;
mapName[type1] = type2;
比如type1设置字符串类型,type2设置整型类型,就可以做到统计字符串出现的次数(每个字符串都对应一个数字。)