时间:2023-02-03 19:52:01 | 来源:建站知识
时间:2023-02-03 19:52:01 来源:建站知识
"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 次。
示例 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 次。
提示:cpdomain[i]
会遵循 "repi d1i.d2i.d3i"
或 "repi d1i.d2i"
格式repi
是范围 [1, 10^4] 内的一个整数cpdomains
为 ss
。idx
代指扫描到的游标位置),先通过指针扫描找到访问数字部分 cnt = ss[i][0:idx]
,然后「从后往前」处理 ss[i] 的 [idx + 1, n - 1] 部分,按照域名层级「从小到大」的顺序进行截取,并累加访问次数 cnt
到当前域名。class Solution { public List<String> subdomainVisits(String[] ss) { Map<String, Integer> map = new HashMap<>(); for (String s : ss) { int n = s.length(), idx = 0; while (idx < n && s.charAt(idx) != ' ') idx++; int cnt = Integer.parseInt(s.substring(0, idx)); int start = idx + 1; idx = n - 1; while (idx >= start) { while (idx >= start && s.charAt(idx) != '.') idx--; String cur = s.substring(idx + 1); map.put(cur, map.getOrDefault(cur, 0) + cnt); idx--; } } List<String> ans = new ArrayList<>(); for (String key : map.keySet()) ans.add(map.get(key) + " " + key); return ans; }}
TypeScript 代码:function subdomainVisits(ss: string[]): string[] { const map = new Map<string, number>() for (const s of ss) { let n = s.length, idx = 0 while (idx < n && s[idx] != ' ') idx++ const cnt = Number(s.substring(0, idx)) const start = idx + 1; idx = n - 1 while (idx >= start) { while (idx >= start && s[idx] != '.') idx-- const cur = s.substring(idx + 1) if (!map.has(cur)) map.set(cur, 0) map.set(cur, map.get(cur) + cnt) idx-- } } const ans = new Array<string>() for (const key of map.keys()) ans.push(map.get(key) + " " + key) return ans};
Python 代码:class Solution: def subdomainVisits(self, ss: List[str]) -> List[str]: mapping = defaultdict(int) for s in ss: n, idx = len(s), 0 while idx < n and s[idx] != ' ': idx += 1 cnt = int(s[:idx]) start, idx = idx + 1, n - 1 while idx >= start: while idx >= start and s[idx] != '.': idx -= 1 mapping[s[idx + 1:]] += cnt idx -= 1 return [f'{v} {k}' for k, v in mapping.items()]
No.811
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。关键词:运用,简单,访问