面向小白的力扣811. 子域名访问计数

144 阅读2分钟

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

今天,我们继续搞算法。

题目描述

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

image.png

题目分析

这个题目是让我们统计域名,那统计我们自然就想到映射,然后组合返回,我们需要把原数据按照空格分开,然后进行映射,有相同的字符串就对应加1,否则就放原数值。如果子里面包含com,还得减掉。

解题思路

  • 确定操作对象:本题中,操作数组就1个cpdomains
  • 确定操作条件:操作条件拿到一二三级域名,进行映射计算值。
  • 确定操作过程:操作过程为,遍历所有数组,拿到域名计算值之后,将映射的结果拼接返回。
  • 确定结果返回:返回答案。

代码

class Solution {
   public static List<String> subdomainVisits(String[] cpdomains) {
        List<String> list = new ArrayList<String>();
        Map<String,Integer> map = new HashMap<String, Integer>();
        for (String cpdo :cpdomains){
            String[] cpdos = cpdo.split(" ");
            String s =cpdos[0];
            String cpdomas =cpdos[1];
            String cpdoma = cpdomas.substring(cpdomas.indexOf(".")+1);
            String com = cpdomas.substring(cpdomas.lastIndexOf(".")+1);
            calc(map, s, cpdomas);
            calc(map, s, com);
            calc(map, s, cpdoma);
            if (cpdoma.equals(com)){
                Integer integer = map.get(com);
                map.put(cpdoma,integer.intValue()-Integer.valueOf(s));
            }

        }
        Set<String> set = map.keySet();
        for (String s : set) {
            Integer integer = map.get(s);
            list.add(String.valueOf(integer.intValue())+" "+s);
        }
        return list;
    }

      private static void calc(Map<String, Integer> map, String s, String key) {
        if (map.containsKey(key)){
            Integer integer = map.get(key);
            Integer val = integer.intValue()+Integer.valueOf(s);
            map.put(key,Integer.valueOf(val));
        }else{

            map.put(key,Integer.valueOf(s));
        }
    }
}

总结

这是一道中等题目,我觉得题目本身不是很难,而且也比较容易想,关键是在设计算法的时候要考虑清楚情况,遇到这些情况怎么办,就可以写出来了。