leetcode:811. 子域名访问计数

一个网站域名,如"discuss.leetcode.com",包含了多个子域名。作为顶级域名,常用的有"com",下一级则有"leetcode.com",最低的一级为"discuss.leetcode.com"。当我们访问域名"discuss.leetcode.com"时,也同时访问了其父域名"leetcode.com"以及顶级域名 “com”。

给定一个带访问次数和域名的组合,要求分别计算每个域名被访问的次数。其格式为访问次数+空格+地址,例如:“9001 discuss.leetcode.com”。

接下来会给出一组访问次数和域名组合的列表cpdomains 。要求解析出所有域名的访问次数,输出格式和输入格式相同,不限定先后顺序。

示例

哈希映射

对于一个包含.的域名x.y,我们需要统计的是x.y和y;对于两个包含.的域名a.b.c,我们需要统计的是a.b.c,b.c和c。在统计这些字符串时,我们可以使用哈希映射(HashMap)。统计结束之后,我们遍历哈希映射并输出结果。
时间复杂度:O(N),其中N是数组cpdomains的长度
空间复杂度:O(N),用于存储哈希映射

class Solution {
    public List<String> subdomainVisits(String[] cpdomains) {
        Map<String, Integer> counts = new HashMap();
        for(String domain : cpdomains){
            //\s匹配任何空白字符,包括空格、制表符、换页符等等。
            //匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
            String[] cpinfo = domain.split("\\s+");
            //将空格后面的域名按照.分开保存在frags数组中
            String[] frags = cpinfo[1].split("\\.");
            int count = Integer.valueOf(cpinfo[0]);
            String cur = "";
            for(int i = frags.length - 1; i >= 0; i--){
                cur = frags[i] + (i < frags.length - 1 ? "." : "") + cur;
                counts.put(cur, counts.getOrDefault(cur, 0) + count);
            }
        }

        List<String> ans = new ArrayList<>();
        for(String str : counts.keySet()){
            ans.add("" + counts.get(str) + " " + str);
        }
        Collections.reverse(ans);
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值