持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
题目描述
网站域名 "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 ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。
示例 1:
输入:cpdomains = ["9001 discuss.leetcode.com"]
输出:["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]
解释:例子中仅包含一个网站域名:"discuss.leetcode.com"。
按照前文描述,子域名 "leetcode.com" 和 "com" 都会被访问,所以它们都被访问了 9001 次。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subdomain-visit-count
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法题目是字符串处理题目,题目要求计算子域名访问计数。那什么是子域名呢?题目中给定了子域名的定义,网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" ,二级域名为 "leetcode.com" ,最低一级为 "discuss.leetcode.com"。简单理解,就是我们需要从完整域名开始,按照 . 分割,依次分割出三级域名,二级域名和顶级域名。
- 统计域名的访问次数,我们最常用的数据结构是HashMap, HashMap 是以空间换时间的数据结构,我们可以以域名为 key, 访问次数为 value 做存储。
- 在做字符串拼接的时候,建议使用StringBuilder来操作,执行效率高。具体实现代码如下,供参考。
通过代码
class Solution {
public List<String> subdomainVisits(String[] cpdomains) {
List<String> ans = new LinkedList<>();
Map<String, Integer> map = new HashMap<>();
for (String item : cpdomains) {
String[] temp = item.split(" ");
Integer nums = Integer.parseInt(temp[0]);
String domainInfo = temp[1];
List<String> domains = new LinkedList<>();
domains.add(domainInfo);
int n = domainInfo.length();
for (int i = 0; i < domainInfo.length(); i++) {
if ('.' == domainInfo.charAt(i)) {
domains.add(domainInfo.substring(i + 1, n));
}
}
for (String domain : domains) {
map.put(domain, map.getOrDefault(domain, 0) + nums);
}
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
StringBuilder builder = new StringBuilder();
builder.append(entry.getValue());
builder.append(" ");
builder.append(entry.getKey());
ans.add(builder.toString());
}
return ans;
}
}
总结
- 这个题目理解题意之后,我们采用 hashMap 数据结构即可解决,本题重点考察的是对编程语言API的掌握程度。
- 上述算法的时间复杂度是O(n),空间复杂度是O(n)
- 坚持算法每日一题,加油!