持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 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提交记录如下:
- 时间复杂度:O(n),n为cpdomains数组长度
- 空间复杂度:O(n),n为cpdomains元素临时占用字典到空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~