【LeetCode】子域名访问计数Java题解

46 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

题目描述

网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" ,二级域名为 "leetcode.com" ,最低一级为 "discuss.leetcode.com" 。当访问域名 "discuss.leetcode.com" 时,同时也会隐式访问其父域名 "leetcode.com" 以及 "com" 。

计数配对域名 是遵循 "rep d1.d2.d3" 或 "rep d1.d2" 格式的一个域名表示,其中 rep 表示访问域名的次数,d1.d2.d3 为域名本身。

例如,"9001 discuss.leetcode.com" 就是一个 计数配对域名 ,表示 discuss.leetcode.com 被访问了 9001 次。 给你一个 计数配对域名 组成的数组 cpdomains ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

 

示例 1:

输入:cpdomains = ["9001 discuss.leetcode.com"]
输出:["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]
解释:例子中仅包含一个网站域名:"discuss.leetcode.com"。
按照前文描述,子域名 "leetcode.com""com" 都会被访问,所以它们都被访问了 9001 次。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subdomain-visit-count
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是字符串处理题目,题目要求计算子域名访问计数。那什么是子域名呢?题目中给定了子域名的定义,网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" ,二级域名为 "leetcode.com" ,最低一级为 "discuss.leetcode.com"。简单理解,就是我们需要从完整域名开始,按照 . 分割,依次分割出三级域名,二级域名和顶级域名。
  • 统计域名的访问次数,我们最常用的数据结构是HashMap, HashMap 是以空间换时间的数据结构,我们可以以域名为 key, 访问次数为 value 做存储。
  • 在做字符串拼接的时候,建议使用StringBuilder来操作,执行效率高。具体实现代码如下,供参考。

通过代码

class Solution {
    public List<String> subdomainVisits(String[] cpdomains) {
        List<String> ans = new LinkedList<>();
        Map<String, Integer> map = new HashMap<>();
        for (String item : cpdomains) {
            String[] temp = item.split(" ");
            Integer nums = Integer.parseInt(temp[0]);
            String domainInfo = temp[1];
            List<String> domains = new LinkedList<>();
            domains.add(domainInfo);
            int n = domainInfo.length();
            for (int i = 0; i < domainInfo.length(); i++) {
                if ('.' == domainInfo.charAt(i)) {
                    domains.add(domainInfo.substring(i + 1, n));
                }
            }

            for (String domain : domains) {
                map.put(domain, map.getOrDefault(domain, 0) + nums);
            }
        }

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            StringBuilder builder = new StringBuilder();
            builder.append(entry.getValue());
            builder.append(" ");
            builder.append(entry.getKey());
            ans.add(builder.toString());
        }

        return ans;
    }

}

总结

  • 这个题目理解题意之后,我们采用 hashMap 数据结构即可解决,本题重点考察的是对编程语言API的掌握程度。
  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!