算法小知识-----10.06----- 子域名访问计数

105 阅读2分钟

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

国庆已经来到了倒数第二天了,开始假期后遗症了,emoing

子域名访问计数

该题出自力扣的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 为域名本身。

image.png

  • 题意就是给出一个字符串的数组,数组是由 数量 + 域名组成。需要最终返回一个指定格式的字符串列表
  • 那么归纳起来也很好实现的,首先域名的构造是通过"."去切割的,那么就肯定需要通过切割字符串去实现每一个子域名
  • 那么切割好以后,就需要有一个数据结构去收纳这些次数和对应的子域名。很明显,最后使用了HashMap,存储对应的次数和子域名
  • 构造一个私有方法,功能是对字符串进行切割和取出对应的子域名存储HashMap,利用StringBuilder,减少String的构造
  • 遍历数组 cpdomains,对于每个计数配对域名,获得计数和完整域名,更新哈希表中的每个子域名的访问次数。
  • 实例化一个字符串列表,遍历HashMap,存储并返回即可

编码

class Solution {
    HashMap<String,Integer> map = new HashMap<>();
    public List<String> subdomainVisits(String[] cpdomains) {
        List<String> list = new ArrayList<>();
        for (String a:cpdomains) {
            String[] s = a.split(" ");
            Integer num = Integer.valueOf(s[0]);
            match(s[1],num);
        }
        map.forEach((k,v) ->{
            StringBuilder sb =new StringBuilder();
            sb.append(v).append(" ").append(k);
            list.add(sb.toString());
        });
        return list;
    }

    private void match(String s,Integer num){
        String[] split = s.split("[.]");
        int len = split.length;
        StringBuilder sb =new StringBuilder();
        for (int i = len -1; i >=0 ; i--) {
            sb.insert(0,split[i]);
            String s1 = sb.toString();
            map.put(s1,map.getOrDefault(s1,0) + num);
            sb.insert(0,".");
        }
    }
}

image.png