811. 子域名访问计数(难度:中等)

2023-04-05  本文已影响0人  一直流浪

题目描述:https://leetcode.cn/problems/subdomain-visit-count/

题目描述:

网站域名 "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 为域名本身。

给你一个 计数配对域名 组成的数组 cpdomains ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

示例 1:

输入:cpdomains = ["9001 discuss.leetcode.com"]
输出:["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]
解释:例子中仅包含一个网站域名:"discuss.leetcode.com"。
按照前文描述,子域名 "leetcode.com" 和 "com" 都会被访问,所以它们都被访问了 9001 次。

示例 2:

输入:cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]
输出:["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]
解释:按照前文描述,会访问 "google.mail.com" 900 次,"yahoo.com" 50 次,"intel.mail.com" 1 次,"wiki.org" 5 次。
而对于父域名,会访问 "mail.com" 900 + 1 = 901 次,"com" 900 + 50 + 1 = 951 次,和 "org" 5 次。

提示:

解法:哈希算法

首先,定义一个HashMap<String,Integer> map来记录每一个域名出现的次数。通过遍历字符串数组,对每一个字符串先安装空格进行分割,前面是出现次数,后面是字符串域名,然后在对后面的字符串域名根据.号进行分割,然后我们再一次拼接所有的子域名,并将出现次数记录到一个HashMap中,当子域名已经出现过,则累加即可。最终,得到的map中就是每一个域名即对应出现的次数。然后在遍历map重新组装字符串即可得到最终结果。

代码:

class Solution {
    public List<String> subdomainVisits(String[] cpdomains) {
        Map<String, Integer> map = new HashMap<>();
        for (String cpdomain : cpdomains) {
            String[] s = cpdomain.split(" ");
            String temp = "";
            Integer t = Integer.valueOf(s[0]);
            String[] split = s[1].split("\\.");
            for (int i = split.length - 1; i >= 0; i--) {
                if (temp.equals("")) {
                    temp = split[i];
                } else {
                    temp = split[i] + "." + temp;
                }
                map.put(temp, map.getOrDefault(temp, 0) + t);
            }
        }
        List<String> result = new ArrayList<>();

        for (String key : map.keySet()) {
            String str = map.get(key) + " " + key;
            result.add(str);
        }
        return result;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读