题目:
A website domain like “discuss.leetcode.com” consists of various subdomains. At the top level, we have “com”, at the next level, we have “leetcode.com”, and at the lowest level, “discuss.leetcode.com”.When we visit a domain like “discuss.leetcode.com”, we will also visit the parent domains “leetcode.com” and “com” implicitly.
Now, call a “count-paired domain” to be a count (representing the number of visits this domain received), followed by a space, followed by the address. An example of a count-paired domain might be “9001 discuss.leetcode.com”.
We are given a list cpdomains of count-paired domains. We would like a list of count-paired domains, (in the same format as the input, and in any order), that explicitly counts the number of visits to each subdomain.
Example 1:
Input: [“9001 discuss.leetcode.com”]
Output: [“9001 discuss.leetcode.com”, “9001 leetcode.com”, “9001 com”]
Explanation:
We only have one website domain: “discuss.leetcode.com”. As discussed above, the subdomain “leetcode.com” and “com” will also be visited. So they will all be visited 9001 times.Example 2:
Input: [“900 google.mail.com”, “50 yahoo.com”, “1 intel.mail.com”, “5 wiki.org”]
Output: [“901 mail.com”,“50 yahoo.com”,“900 google.mail.com”,“5 wiki.org”,“5 org”,“1 intel.mail.com”,“951 com”]
Explanation:
We will visit “google.mail.com” 900 times, “yahoo.com” 50 times, “intel.mail.com” once and “wiki.org” 5 times. For the subdomains, we will visit “mail.com” 900 + 1 = 901 times, “com” 900 + 50 + 1 = 951 times, and “org” 5 times.
Notes:The length of cpdomains will not exceed 100. The length of each
domain name will not exceed 100. Each address will have either 1 or 2
“.” characters. The input count in any count-paired domain will not
exceed 10000. The answer output can be returned in any order.
解释:
统计各个子域名出现的次数。用字典来做很方便。
python代码:
class Solution(object):
def subdomainVisits(self, cpdomains):
"""
:type cpdomains: List[str]
:rtype: List[str]
"""
_dict={}
for domain in cpdomains:
domain=domain.replace(' ','.').split('.')
for i in xrange(1,len(domain)):
item='.'.join(domain[i:])
_dict[item]=_dict.get(item,0)+int(domain[0])
return [' '.join([str(v),k]) for k ,v in _dict.items()]
c++代码:
#include <unordered_map>
#include <string>
class Solution {
public:
vector<string> subdomainVisits(vector<string>& cpdomains) {
unordered_map<string,int> _map;
for(auto domain:cpdomains )
{
int i=domain.find(" ");
int n =stoi(domain.substr(0,i));
string s=domain.substr(i+1);
for (int i=s.size()-1;i>=0;i--)
{
if (s[i]=='.')
_map[s.substr(i+1)]+=n;
else if (i==0)
_map[s.substr(i)]+=n;
}
}
vector<string> result;
for(auto item :_map)
result.push_back(to_string(item.second)+" "+item.first);
return result;
}
};
总结:
学会使用c++ string头文件中的substr()函数
substr有2种用法:
假设:string s = “0123456789”;
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = “56789”
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = “567”
学会使用stoi()函数和string 头文件中的to_string() 函数。学会使用stl中map的用法。
本题的cpp中map中不存在时,返回默认值0。
#include <iostream>
#include<map>
using namespace std;
int main()
{
map<int,int> _map;
cout<<_map[1]<<endl;
}
输出是0。