持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
811. 子域名访问计数
题目
原题链接: leetcode.cn/problems/su…
示例 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 次。
解题思路
我们可以透过 Map 对象进行匹配,然后获取对应的调用次数,由题意
- 计数配对域名 是遵循 "rep d1.d2.d3" 或 "rep d1.d2" 格式的一个域名表示
- 那么域名是"rep d1.d2.d3",那么子域名格式为
- "d1.d2.d3"
- "d2.d3"
- "d3"
- 如果域名是"rep d1.d2",那么子域名分别为:
- "d1.d2"
- "d2"
那么上面的子域名分别被执行
rep次数
- 那么域名是"rep d1.d2.d3",那么子域名格式为
步骤一 设置 Map 对象
var subdomainVisits = function (cpdomains) {
// 首先我们先设置用来储存键值的Map
const map = new Map()
// 最终结果
const res = []
};
步骤二 获取域名的访问次数和域名模块
通过 split 分割 次数和域名模块
...省略
// 获取每一项的值
for (const item of cpdomains) {
// 这样我们就获得了 次数和域名模块
const [count, domain] = item.split(' ')
}
...省略
步骤三 将域名和访问次数存入 map
...省略
map.set(domain, (map.get(domain) || 0) + Number(count));
for (let i = 0; i < domain.length; i++) {
if (domain[i] === '.') {
// 作为键值的子域名
const subDomain = domain.slice(i + 1);
// 如果此前这个子域名之前被访问过,就再增加上次数
map.set(subDomain, (map.get(subDomain) || 0) + count);
}
}
...省略
步骤四 通过 entries 方法,遍历 map 对象,获取最终的值
for (const [subdomain, count] of map.entries()) {
res.push(count + " " + subdomain);
}
return res
完整代码
var subdomainVisits = function (cpdomains) {
// 首先我们先设置用来储存键值的Map
const map = new Map()
// 最终结果
const res = []
// 获取每一项的值
for (const item of cpdomains) {
// 这样我们就获得了 次数和域名模块
const [count, domain] = item.split(' ')
// 最长的域名也要设置一下值
map.set(domain, (map.get(domain) || 0) + Number(count));
for (let i = 0; i < domain.length; i++) {
if (domain[i] === '.') {
// 作为键值的子域名
const subDomain = domain.slice(i + 1);
// 如果此前这个子域名之前被访问过,就再增加上次数
map.set(subDomain, (map.get(subDomain) || 0) + count);
}
}
}
for (const [subdomain, count] of map.entries()) {
res.push(count + " " + subdomain);
}
return res
};
总结一下:
- 我们的主要是设置 Map 对象
- 然后获取各个域名的访问次数
- 然后遍历输入的数据,然后根据 map 设置对应的值