友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

811. 子域名访问计数

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

计数配对域名 是遵循 rep d1.d2.d3rep 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.d3irepi d1i.d2i 格式

  • repi 是范围 [1, 104] 内的一个整数

  • d1id2id3i 由小写英文字母组成

思路分析

哈希+字符串解析:从字符串中解析出数字和域名,再对域名解析出子域名。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-07-05 21:38:16
 */
public List<String> subdomainVisits(String[] cpdomains) {
  Map<String, Integer> counter = new HashMap<>();
  for (String cpdomain : cpdomains) {
    int index = cpdomain.indexOf(" ");
    int count = Integer.parseInt(cpdomain.substring(0, index));
    String domain = cpdomain.substring(index + 1);
    while (!domain.isEmpty()) {
      counter.put(domain, counter.getOrDefault(domain, 0) + count);
      int idx = domain.indexOf(".");
      if (idx == -1) {
        break;
      }
      domain = domain.substring(idx + 1);
    }
  }
  List<String> result = new ArrayList<>(counter.size());
  counter.forEach((key, value) -> {
    result.add(value + " " + key);
  });
  return result;
}