LeetCode 811题 子域名访问计数 -- JavaScript

题目描述:

一个网站域名,如"discuss.leetcode.com",包含了多个子域名。作为顶级域名,常用的有"com",下一级则有"leetcode.com",最低的一级为"discuss.leetcode.com"。当我们访问域名"discuss.leetcode.com"时,也同时访问了其父域名"leetcode.com"以及顶级域名 "com"。

给定一个带访问次数和域名的组合,要求分别计算每个域名被访问的次数。其格式为访问次数+空格+地址,例如:"9001 discuss.leetcode.com"。

接下来会给出一组访问次数和域名组合的列表cpdomains 。要求解析出所有域名的访问次数,输出格式和输入格式相同,不限定先后顺序。

示例 : 

输入: ["9001 discuss.leetcode.com"]
输出: ["9001 discuss.leetcode.com", "9001 leetcode.com", "9001 com"]
说明: 例子中仅包含一个网站域名:"discuss.leetcode.com"。按照前文假设,子域名"leetcode.com"和"com"都会被访问,所以它们都被访问了9001次。
输入: ["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 次。

注意

  •  cpdomains 的长度小于 100
  • 每个域名的长度小于100
  • 每个域名地址包含一个或两个"."符号。
  • 输入中任意一个域名的访问次数都小于10000

方法分析:

该题从方法上来看,其实还是比较简单的。首先,我们应该将域名的访问次数和域名分离开。然后通过"."分隔得到所有的子域名,其访问次数初始化为整个域名的访问次数,并将以"域名:次数"的形式存入Map之中。后续读取的时候,判断Map中是否存在该域名即可,如果存在,就累加,如果不存在,就设置其初始值。通过这些操作,就会得到所有"域名:次数"的组合,最后遍历Map,将其中的每项转化为"次数 域名"的形式即可。

代码实现:

var subdomainVisits = function(cpdomains) {
  let map = new Map();
  let result = [];
  cpdomains.map(item => {
    let [count, domains] = item.split(" ");
    let fromIndex = 0;
    while (fromIndex != -1) {
      let subDomain = domains.slice(fromIndex + (fromIndex != 0 ? 1 : 0));
      map.get(subDomain) ? map.set(subDomain, map.get(subDomain) + +count) : map.set(subDomain, +count);
      fromIndex = domains.indexOf(".", fromIndex + 1);
    }
  })
  map.forEach((v, k) => result.push(v + " " + k))
  return result;
};

代码解析:

该代码采用了ES6中的Map结构来存放各域名和其访问次数,若要获取关于Map的相关知识,可以访问:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map。简而言之,Map对象保存的是键值对。对域名列表cpdomains进行遍历,首先分离出次数count和域名domains。然后遍历域名domains,截取子域名subDomain。然后判断该域名是否存在于map中,如果存在,就获取之前的count再与该次的进行累加,注意count是字符串类型,所以此处利用 +count 将其转换为数字型。如果不存在,就设置为当前count即可,然后移动起点,循环此前操作,直到不存在子域名为止。最后将其按照指定格式,输出到结果数组即可。

参考链接:https://leetcode-cn.com/problems/subdomain-visit-count/

你可能感兴趣的:(LeetCode)