持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
大家好 我是丝瓜咸蛋汤。今天带来的是一道在LeetCode上的题目,题目难度为中等
。就在此为大家分享一下解答思路。
题目阐述
网站域名 "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 ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。
示例 1:
输入:cpdomains = ["9001 discuss.leetcode.com"] 输出:["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"] 解释:例子中仅包含一个网站域名:"discuss.leetcode.com"。 按照前文描述,子域名 "leetcode.com" 和 "com" 都会被访问,所以它们都被访问了 9001 次。
思路阐述
其实这道题目的思路是属于比较清晰的,因为其实不外乎做两件事情,一是遍历,二是统计。
对于每一行的字符串:
关于遍历,我们可以先使用split()
方法去分割字符串,然后通过reduce
方法去做哈希表的处理。
关于键值对配对统计,我们不难想到使用一个哈希表去存储了统计结果。
代码实现
function subdomainVisits(cpdomains: string[]): string[] {
let map = new Map<string, number>();
let res = [];
for (let i = 0; i < cpdomains.length; i++) counttimes(map, cpdomains[i]);
for (const [key, value] of map.entries()) {
res.push(value + " " + key);
}
return res;
}
function counttimes(map: Map<string, number>, website: string) {
let times = Number(website.split(" ")[0]);
let domainsStr = website.split(" ")[1].split(".").reverse();
let suffix = domainsStr[0];
domainsStr.reduce((pv: string, cv: string) => {
let domain = cv + "." + pv;
if (map.has(domain)) map.set(domain, times + map.get(domain));
else map.set(domain, times);
return domain;
});
if (map.has(suffix)) map.set(suffix, times + map.get(suffix));
else map.set(suffix, times);
}
题目评价
其实这道题目的逻辑真的不难,但是代码量其实还是挺大的,如果是以做题时间为标准的话其实确实是属于一个中等级别的难度的编程题目。
而且本题还有一个降低难度的点就是:
输出不需要考虑顺序
如果输出需要考虑顺序的话,可能要通过map.keys().sort()
排序 取值 构建字符串去输出。
我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!