刷完LeetCode题库——811. 子域名访问计数

60 阅读2分钟

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

题目详情

LeetCode题库序号 811. 子域名访问计数 ,难度为 中等

Tag : 「哈希表」 网站域名 "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 次。

示例 2:

输入:cpdomains = ["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"]
解释:按照前文描述,会访问 "google.mail.com" 900 次,"yahoo.com" 50 次,"intel.mail.com" 1 次,"wiki.org" 5 次。
而对于父域名,会访问 "mail.com" 900 + 1 = 901 次,"com" 900 + 50 + 1 = 951 次,和 "org" 5 次。

提示:

  • 1 <= cpdomain.length <= 100
  • 1 <= cpdomain[i].length <= 100
  • cpdomain[i] 会遵循 "repi d1i.d2i.d3i" 或 "repi d1i.d2i" 格式
  • repi 是范围 [1, 104] 内的一个整数
  • d1i、d2i 和 d3i 由小写英文字母组成

哈希表

题解思路: 题目中的域名有分为层级,首先我们需要使用哈希表去记录每级域名的数量,每级域名都要进行切分,然后再进行重新组合,组合的过程中把对应的数量进行添加即可。题目解法详情见以下代码:

题解代码

class Solution {
    public List<String> subdomainVisits(String[] cpdomains) {
        Map<String, Integer> map = new HashMap<>();
        for (String domain : cpdomains) {
            String[] numArr = domain.split(" ");
            String[] domainPart = numArr[1].split("\\.");
            StringBuilder sb = new StringBuilder();
            for (int i = domainPart.length - 1; i >= 0; i--) {
                StringBuilder append;
                if (sb.length() > 0) {
                    append = new StringBuilder(domainPart[i]).append(".").append(sb);
                } else {
                    append = new StringBuilder(domainPart[i]);
                }
                sb = append;
                String currentDomain = append.toString();
                Integer domainNum = map.get(currentDomain);
                if (domainNum == null) {
                    map.put(currentDomain, Integer.valueOf(numArr[0]));
                } else {
                    map.put(currentDomain, Integer.parseInt(numArr[0]) + domainNum);
                }
            }
        }

        List<String> ans = new ArrayList<>();
        map.forEach((k, v) -> ans.add(v + " " + k));

        return ans;
    }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.811 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…