lintcode1006. 子域名访问计数

二次信任 提交于 2020-01-27 08:00:57

诸如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.
会有12.包含在每个域名中.
任何域名的访问计数都不会超过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;}
        }
    }
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!