811. 子域名访问计数(哈希表应用)

114 阅读3分钟

image.jpeg

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

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 1 <= cpdomain.length <= 100
    • 1 <= cpdomain[i].length <= 100
    • cpdomain[i] 会遵循 "repi d1i.d2i.d3i" 或 "repi d1i.d2i" 格式
    • repi 是范围 [1, 104] 内的一个整数
    • d1i、d2i 和 d3i 由小写英文字母组成

二、思路分析:

我们今天拿到本题是 leetcode 难度为中等题 811. 子域名访问计数。根据题目要求需要对域名数组继续拆解,求出数组中所有域名请求总数和地址。那么域名构成是怎么样的呢?

  • 域名:通常格式为"d1:d2:d3",从右到左可以看到其子域为顶级域:'d3',二级域:"d2:d3",最低一级的域:"d1:d2:d3"
  • 计数配对域名:由"rep d1.d2.d3" 或 "rep d1.d2" 格式的一个域名表示,rep代表该域名地址请求次数
  • 本题中各级的域名地址都是由小写字母组成

根据本题子域名的介绍,我们可以借助哈希表方式将各级域名与请求数建立起key-value来进行求解,思路如下:

  • 方法:哈希表应用

    • 本题给出的cpdomains里的元素都满足计数配对域名格式要求,因此创建一个初始化dict()
    • 使用for循环取出domain,将其进行split按空格方式分割,可以获取到rep请求数rep_domain[0]
    • rep_domain_list[1] 为域名地址,可以再次进行按照"."方式进行分割,再使用for循环对子域名进行拼接,域名名字为key,请求数为value依次添加到cpd字典中
    • 最后遍历完cpdomains数组后,将得到的cpd字典,将value + " " + key拼接,装入到列表中并作为结果返回
    class Solution(object):
        def subdomainVisits(self, cpdomains):
            """
            :type cpdomains: List[str]
            :rtype: List[str]
            """
            cpd = dict()
    
            for id, ordomain in enumerate(cpdomains):
                rep_domain = ordomain.split()
                domainlist = rep_domain[1].split(".")
                for i in range(len(domainlist)-1,-1,-1):
                    if i != len(domainlist)-1:
                        tmp = domainlist[i] + "." + tmp
                    else:
                        tmp = domainlist[i]
                    if tmp not in cpd.keys():
                        cpd[tmp] = rep_domain[0]
                    else:
                        repnum = int(cpd[tmp]) + int(rep_domain[0])
                        cpd[tmp] = str(repnum)
            ans = []
            for i in cpd.keys():
                ans.append(cpd[i] + " " + i)
            return ans
    
  • 方法:优化

    • 优化一:Counter()函数
    • 使用字符串分片方法来获取子域名
    • 通过Counter.item取出域名请求数rep和域名地址
    class Solution(object):
        def subdomainVisits(self, cpdomains):
            cnt = Counter()
            for domain in cpdomains:
                c, s = domain.split()
                c = int(c)
                cnt[s] += c
                while '.' in s:
                    s = s[s.index('.') + 1:]
                    cnt[s] += c
            return [str(c) +" " + s for s, c in cnt.items()]
    

三、总结:

本题考察对哈希表key-value的应用,在本题中子域名作为key,请求数作为value,当遇到同样的key时只需要更新value值就可以了,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为cpdomains数组长度
  • 空间复杂度:O(n),n为cpdomains元素临时占用字典到空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~