持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
今天,我们继续搞算法。
题目描述
网站域名 "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,否则就放原数值。如果子里面包含com,还得减掉。
解题思路
- 确定操作对象:本题中,操作数组就1个cpdomains
- 确定操作条件:操作条件拿到一二三级域名,进行映射计算值。
- 确定操作过程:操作过程为,遍历所有数组,拿到域名计算值之后,将映射的结果拼接返回。
- 确定结果返回:返回答案。
代码
class Solution {
public static List<String> subdomainVisits(String[] cpdomains) {
List<String> list = new ArrayList<String>();
Map<String,Integer> map = new HashMap<String, Integer>();
for (String cpdo :cpdomains){
String[] cpdos = cpdo.split(" ");
String s =cpdos[0];
String cpdomas =cpdos[1];
String cpdoma = cpdomas.substring(cpdomas.indexOf(".")+1);
String com = cpdomas.substring(cpdomas.lastIndexOf(".")+1);
calc(map, s, cpdomas);
calc(map, s, com);
calc(map, s, cpdoma);
if (cpdoma.equals(com)){
Integer integer = map.get(com);
map.put(cpdoma,integer.intValue()-Integer.valueOf(s));
}
}
Set<String> set = map.keySet();
for (String s : set) {
Integer integer = map.get(s);
list.add(String.valueOf(integer.intValue())+" "+s);
}
return list;
}
private static void calc(Map<String, Integer> map, String s, String key) {
if (map.containsKey(key)){
Integer integer = map.get(key);
Integer val = integer.intValue()+Integer.valueOf(s);
map.put(key,Integer.valueOf(val));
}else{
map.put(key,Integer.valueOf(s));
}
}
}
总结
这是一道中等题目,我觉得题目本身不是很难,而且也比较容易想,关键是在设计算法的时候要考虑清楚情况,遇到这些情况怎么办,就可以写出来了。