每日一题 子域名访问计数

718 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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次数

步骤一 设置 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 设置对应的值

image.png