持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
刷题的日常-2022年10月5号
一天一题,保持脑子清爽
子域名访问计数
来自leetcode的 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 为域名本身。
- 例如,"9001 discuss.leetcode.com" 就是一个 计数配对域名 ,表示 discuss.leetcode.com 被访问了 9001 次。
给你一个 计数配对域名 组成的数组 cpdomains ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。
理解题意
我们可以从题意中提取的条件如下:
- 题目给出一组域名,包含域名的访问次数
- 要求我们统计域名及其子域名的访问次数
做题思路
这里直接用暴力解
- 首先开辟个map做域名和访问次数的映射
- 然后循环每个域名
- 提取出访问域名的次数
- 如果当前域名包含子域名,则需要将子域名在此进行处理
- 最后将map中的键值对组合成题目要求的形式进行返回
代码实现
代码实现如下:
public class Solution {
public List<String> subdomainVisits(String[] cpdomains) {
Map<String, Integer> result = new HashMap<>();
int idx, sum, len;
char c;
for (String cpdomain : cpdomains) {
idx = 0;
sum = 0;
while ((c = cpdomain.charAt(idx++)) != ' ') {
sum *= 10;
sum += c - '0';
}
String[] s = cpdomain.substring(idx).split("\\.");
len = s.length - 1;
int integer = result.computeIfAbsent(s[len], o -> 0);
result.put(s[len], integer + sum);
for (int length = s.length - 2; length >= 0; length--) {
s[len] = s[length] + '.' + s[len];
integer = result.computeIfAbsent(s[len], o -> 0);
result.put(s[len], integer + sum);
}
}
return result.entrySet().stream().map(o -> o.getValue() + " " + o.getKey()).collect(Collectors.toList());
}
}