刷题的日常-子域名访问计数

76 阅读2分钟

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

刷题的日常-2022年10月5号

一天一题,保持脑子清爽

子域名访问计数

来自leetcode的 811 题,题意如下:

网站域名 "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 ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

理解题意

我们可以从题意中提取的条件如下:

  • 题目给出一组域名,包含域名的访问次数
  • 要求我们统计域名及其子域名的访问次数

做题思路

这里直接用暴力解

  • 首先开辟个map做域名和访问次数的映射
  • 然后循环每个域名
  • 提取出访问域名的次数
  • 如果当前域名包含子域名,则需要将子域名在此进行处理
  • 最后将map中的键值对组合成题目要求的形式进行返回

代码实现

代码实现如下:

public class Solution {
    public List<String> subdomainVisits(String[] cpdomains) {
        Map<String, Integer> result = new HashMap<>();
        int idx, sum, len;
        char c;
        for (String cpdomain : cpdomains) {
            idx = 0;
            sum = 0;
            while ((c = cpdomain.charAt(idx++)) != ' ') {
                sum *= 10;
                sum += c - '0';
            }
            String[] s = cpdomain.substring(idx).split("\\.");
            len = s.length - 1;
            int integer = result.computeIfAbsent(s[len], o -> 0);
            result.put(s[len], integer + sum);
            for (int length = s.length - 2; length >= 0; length--) {
                s[len] = s[length] + '.' + s[len];
                integer = result.computeIfAbsent(s[len], o -> 0);
                result.put(s[len], integer + sum);
            }
        }
        return result.entrySet().stream().map(o -> o.getValue() + " " + o.getKey()).collect(Collectors.toList());
    }
}

image.png