诸如discuss.lintcode.com这样的域名由各种子域名构成。最顶层是com,下一层是lintcode.com,最底层是discuss.lintcode.com.当访问discuss.lintcode.com时,会隐式访问子域名lintcode.com和com.
现给出域名的访问计数格式为“空格 地址”。 示例:9001 discuss.lintcode.com.
给出计数列表cpdomains. 返回每个子域名(包含父域名)的访问次数(与输入格式相同,顺序任意).
样例
样例 1:
输入:
["9001 discuss.lintcode.com"]
输出:
["9001 discuss.lintcode.com", "9001 lintcode.com", "9001 com"]
解释:
只有一个域名:"discuss.lintcode.com". 如题所述,
子域名"lintcode.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"]
解释:
一共访问900次"google.mail.com",50次"yahoo.com",1次"intel.mail.com",5次"wiki.org".
对于所有的子域名,会访问 900 + 1 = 901 次"mail.com",900 + 50 + 1 = 951 次"com",5次"org".
注意事项
cpdomains的长度不超过100.
每个域名的长度不超过100.
会有1到2个.包含在每个域名中.
任何域名的访问计数都不会超过10000.
返回结果的条目顺序随意.
class Solution {
public:
/**
* @param cpdomains: a list cpdomains of count-paired domains
* @return: a list of count-paired domains
*/
vector<string> subdomainVisits(vector<string> &cpdomains) {
// Write your code here
map<string,int> count;//统计子域名出现次数
vector<string>res;
for (int i = 0; i < cpdomains.size(); i++) {
/* code */
int sum=0;//在域名中访问次数
for (int j = 0; cpdomains[i][j]!=' '; j++) {//得到域名访问次数
/* code */
if(isdigit(cpdomains[i][j])) sum=sum*10+cpdomains[i][j]-'0';
}
vector<string> tmp=str(cpdomains[i]);//获得该域名的所有子域名
for (int k = 0; k < tmp.size(); k++) {//统计子域名出现次数
/* code */
count[tmp[k]]+=sum;
}
}
for (auto i : count) {//调整输出格式
/* code */
string tmp=to_string(i.second);
tmp=tmp+' '+i.first;
res.push_back(tmp);
}
return res;
}
vector<string> str(string tmp)//从后往前遍历得到所有子域名
{
string add="";
vector<string>res;
for (int i = tmp.size()-1; i >= 0; i--) {
/* code */
if(isalpha(tmp[i]))add.insert(add.begin(),tmp[i]);
else if(tmp[i]=='.'){
res.push_back(add);
add.insert(add.begin(),tmp[i]);
}
else if(tmp[i]==' ') { res.push_back(add); return res;}
}
}
};
来源:CSDN
作者:Sinb妃
链接:https://blog.csdn.net/weixin_43981315/article/details/103981285