题目名称

网站域名 “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 ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

示例

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

题解

利用 hash 来存储域名
首先需要将输入的每个域名和访问次数分割开
然后将域名在根据 "." 切分子域名
然后在hash中向对应的子域名访问次数进行加操作
最后将hash展开即可

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param {string[]} cpdomains
* @return {string[]}
*/
var subdomainVisits = function(cpdomains) {
let websiteHahs = {}
for(let i = 0; i < cpdomains.length; i++) {
let item = cpdomains[i]
let [num, str] = item.split(" ")
let web = str.split(".")
for(let i = 0; i < web.length; i++) {
let s = web.slice(i).join(".")
if(!websiteHahs[s]) {
websiteHahs[s] = 0
}
websiteHahs[s] += +num
}
}
return Object.keys(websiteHahs).map(item => [websiteHahs[item], item].join(" "))
};