一个网站域名,如"discuss.leetcode.com",包含了多个子域名。作为顶级域名,常用的有"com",下一级则有"leetcode.com",最低的一级为"discuss.leetcode.com"。当我们访问域名"discuss.leetcode.com"时,也同时访问了其父域名"leetcode.com"以及顶级域名 "com"。
给定一个带访问次数和域名的组合,要求分别计算每个域名被访问的次数。其格式为访问次数+空格+地址,例如:"9001 discuss.leetcode.com"。
接下来会给出一组访问次数和域名组合的列表cpdomains
。要求解析出所有域名的访问次数,输出格式和输入格式相同,不限定先后顺序。
示例 1: 输入: ["9001 discuss.leetcode.com"] 输出: ["9001 discuss.leetcode.com", "9001 leetcode.com", "9001 com"] 说明: 例子中仅包含一个网站域名:"discuss.leetcode.com"。按照前文假设,子域名"leetcode.com"和"com"都会被访问,所以它们都被访问了9001次。
示例 2 输入: ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"] 输出: ["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"] 说明: 按照假设,会访问"google.mail.com" 900次,"yahoo.com" 50次,"intel.mail.com" 1次,"wiki.org" 5次。 而对于父域名,会访问"mail.com" 900+1 = 901次,"com" 900 + 50 + 1 = 951次,和 "org" 5 次。
注意事项:
-
cpdomains
的长度小于100
。 - 每个域名的长度小于
100
。 - 每个域名地址包含一个或两个"."符号。
- 输入中任意一个域名的访问次数都小于
10000
。
思路:从每个网址的结尾向前查询,如果没有重复的,将以新的的成员加入结果集,如果有重复,则只累加访问数量。
// Subdomain.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<vector>
#include<string>
#include<iostream>
using namespace std;
vector<string> subdomainVisits(vector<string>& cpdomains) {
vector<string> nums;
vector<string> domains;
vector<string> sret;
vector<string> ret;
vector<int> dret;
//访问量和网址分离
for (int i = 0; i < cpdomains.size(); i++)
{
nums.push_back(cpdomains[i].substr(0, cpdomains[i].find(" ")));
domains.push_back(cpdomains[i].substr(cpdomains[i].find(" ")+1));
}
//对每个给定的网址从结尾开始统计
for (int i = 0; i < domains.size(); i++)
{
for (int j = domains[i].size() - 1 ; j >= 0; j--)
{
if (domains[i][j] == '.' )
{
//对每个子串查找是否在已有的结果里有重复
bool same = false;
for (int k = 0; k < sret.size(); k++)
{
if (sret[k].compare(domains[i].substr(j + 1, domains[i].size() - j)) == 0)//相等
{
dret[k] += stoi(nums[i]);
same = true;
break;
}
}
if (!same)
{
sret.push_back(domains[i].substr(j + 1, domains[i].size() - j));
dret.push_back(stoi(nums[i]));
}
}
else if (j == 0)
{
bool same = false;
for (unsigned int k = 0; k < sret.size(); k++)
{
if (sret[k].compare(domains[i]) == 0)//相等
{
dret[k] += stoi(nums[i]);
same = true;
break;
}
}
if (!same)
{
sret.push_back(domains[i]);
dret.push_back(stoi(nums[i]));
}
}
}
}
//填充结果集
for (int i = 0; i < sret.size(); i++)
{
ret.push_back(to_string(dret[i])+' '+ sret[i]);
}
return ret;
}
int main()
{
vector<string> cpdomains;
string str = "900 google.mail.com";
cpdomains.push_back(str);
cpdomains.push_back("50 yahoo.com");
cpdomains.push_back("1 intel.mail.com");
cpdomains.push_back("5 wiki.org");
vector<string> s = subdomainVisits(cpdomains);
for (int i = 0; i < s.size(); i++)
{
cout << s[i] << endl;
}
getchar();
return 0;
}
当然网上还有更方便的方法,就是使用unordered_map,这样存结果更方便。
vector<string> subdomainVisits(vector<string>& cpdomains) {
unordered_map<string, int>d;
for (auto domain : cpdomains) {
int k = domain.find(' ');
int c = stoi(domain.substr(0, k));
string s = domain.substr(k + 1, domain.length() - k - 1);
for (int i = s.size() - 1; i >= 0; i--) {
if (s[i] == '.') {
d[s.substr(i + 1, s.size() - i)] += c;
}
else if (i == 0) {
d[s] += c;
}
}
}
vector<string> val;
for (auto k : d) {
val.push_back(to_string(k.second) + " " + k.first);
}
return val;
}
以上源码来自https://blog.csdn.net/dxx707099957/article/details/79863105(如有侵权则删)