每日力扣-子域名访问计数

96 阅读2分钟

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

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

给你一个 计数配对域名 组成的数组 cpdomains ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

分析

今天我们讲解的题目,力扣将其定义为 mid 中等难度的题目。但是细读题目,其实还远远达不到中等难度,最多算是easy偏上的题目。但是从通过率上来看,将这道题目定义为中等,也情有可原。为什么会造成这种情况呢?我认为最重要的原因之一,就是很多刚学算法的人不知道究竟涉及到什么知识点。

话说回来,这道题目,简单的使用hash表用来计算即可。每个计数配对域名的格式都是"rep d1.d2.d3" 或 "rep d1.d2"。

  1. 遍历数组 cpdomains,得到原始的请求量和域名。
for(String domain : cpdomains) {
    int space = cpdomain.indexOf(' ');
    int count = Integer.parseInt(domain.substring(0, space));
    
}
  1. 依次循环域名,对域名进行hash基数。分别统计出一级、二级、三级域名的数量。
for (int i = 0; i < domain.length(); i++) {
                if (domain.charAt(i) == '.') {
                    String tmp = domain.substring(i + 1);
                    counts.put(tmp, counts.getOrDefault(tmp, 0) + count);
                }
            }
  1. 遍历hash,分别统计出每个域名的数量
 for (Map.Entry<String, Integer> entry : counts.entrySet()) {
            String key = entry.getKey();
            int vaule = entry.getValue();
            ans.add(key + " " + vaule);
        }

总结

一道其实特别简单的题目。但是刚学习算法的同学很有可能因为不知道题目考察的什么内容,而导致自己无从下手。另外,有的同学虽然知道使用hash进行能处理,但是一看到两个 for...for ,就下意识的认为自己的算法是O(N^2)的复杂度 ,导致怀疑自己的思路,进而出现问题。但是实际分析来讲,其实真正的算法复杂度就是O(n)。

结题证明

image.png