持续创作,加速成长!这是我参与「掘金日新计划 · 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 为域名本身。
- 题意就是给出一个字符串的数组,数组是由 数量 + 域名组成。需要最终返回一个指定格式的字符串列表
- 那么归纳起来也很好实现的,首先域名的构造是通过"."去切割的,那么就肯定需要通过切割字符串去实现每一个子域名
- 那么切割好以后,就需要有一个数据结构去收纳这些次数和对应的子域名。很明显,最后使用了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,".");
}
}
}