811. Subdomain Visit Count(python+cpp)

题目:

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值