LeetCode 811. Subdomain Visit Count

1.问题描述

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.

2.算法分析

根据问题描述可知,我们需要统计关键字(子域)出现的次数,即构成键-值对问题,且不允许关键字重复,所以可以使用无序的关联容器unordered_map来保存子域和出现次数。具体分析如下:

2.1 使用关联容器imap来保存cpdomains

1)定义一个unordered_map<string, unsigned> imap,其中string为子域,即在每一个字符串元素中由'.'来分分隔开;unsigned的值为子域出现的频次,不可能小于0,所以定义为无符号型。

2)使用范围for循环遍历每一个字符串元素cpdomain,由于对cpdomain只进行读操作,所以定义为const string (auto)型。

3)在每个字符串元素cpdomain中,子域出现的频次count在最前面且由空格隔开,所以如果找到空格所在的位置pos,则数字字符串位于begin()和begin() + pos之间;

4)经过步骤3)找到count后,需要使用stoi()函数把字符串转换为整型,因为后面需要进行相加运算。

5)把对应的关键字映射到频次;

6)找到'.'的位置,加1操作以后继续对下一个cpdomain进行处理,直到找不到'.';

2.2 关联容器imap转换为字符串res输出

1)定义一个字符串型的顺序容器res;

2)使用vector的成员函数emplace_back()每次向res容器的末端添加一个字符串元素(值,使用to_string()把整型转换为字符串);

3)使用vector的成员函数back()返回容器中的最后一个字符,再使用'+'连接空格和关键字,注意不能使用三次emplace_back(),如果使用了,结果如下图所示,会把空格和关键字单独当作字符串元素添加进来。


3.代码实现

class Solution {
public:
    vector<string> subdomainVisits(vector<string>& cpdomains) {
        unordered_map<string, unsigned> imap;
        for(const string &cpdomain : cpdomains){
            size_t pos = cpdomain.find(' ');//找到第一个数字后面的空格
            string count = string(cpdomain.begin(), cpdomain.begin() + pos);
            while(1){
                pos ++;
                imap[string(cpdomain.begin() + pos, cpdomain.end())] += stoi(count);
                pos = cpdomain.find('.', pos);
                
                if(pos == string::npos) break;
            }
        }
        vector<string> res;
        for(const auto &m : imap){
            //添加新元素到容器的末尾
            res.emplace_back(to_string(m.second));
            res.back() += " ";
            res.back() += m.first;
            //res.emplace_back(" ");
            //res.emplace_back(m.first);
        }
    
        return res;
        
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值