由于不熟悉HashMap,这道Easy的题做出了Midium的感觉/笑哭。
大体思路没什么特别的,外循环对Input里的每一条进行处理,内循环把每个Subdomain挑出来,并计数到HashMap中。
方法1:
class Solution { public static List<String> subdomainVisits(String[] cpdomains) { HashMap<String,Integer> map = new HashMap(); for(String cpd:cpdomains) { String[] temp = cpd.split(" "); int count = Integer.valueOf(temp[0]); String[] subdomains = temp[1].split("\\."); int len = subdomains.length; StringBuilder sb = new StringBuilder(); sb.append(subdomains[len-1]); if(map.containsKey(subdomains[len-1])) { int v = map.get(subdomains[len-1]); map.replace(subdomains[len-1],v+count); } else { map.put(subdomains[len-1],count); } for(int i=1;i<len;i++) { sb.insert(0,‘.‘); sb.insert(0,subdomains[len-1-i]); String k = sb.toString(); if(map.containsKey(k)) map.replace(k, map.get(k)+count); else map.put(k, count); } } List<String> result = new ArrayList<String>(); map.forEach((k,v)->{ StringBuilder sb = new StringBuilder(); sb.append(v);sb.append(‘ ‘);sb.append(k); result.add(sb.toString()); }); return result; } }
垃圾的一批…但是看了看代码不好再优化了呀。绝望的试了试map.entrySet(),(其实用map.keySet()方法再map.getKey()也可以,一样的,得到方法2,只优化了最后map的使用,效果显著:
class Solution { public static List<String> subdomainVisits(String[] cpdomains) { HashMap<String,Integer> map = new HashMap(); for(String cpd:cpdomains) { String[] temp = cpd.split(" "); int count = Integer.valueOf(temp[0]); String[] subdomains = temp[1].split("\\."); int len = subdomains.length; StringBuilder sb = new StringBuilder(); sb.append(subdomains[len-1]); if(map.containsKey(subdomains[len-1])) { int v = map.get(subdomains[len-1]); map.replace(subdomains[len-1],v+count); } else { map.put(subdomains[len-1],count); } for(int i=1;i<len;i++) { sb.insert(0,‘.‘); sb.insert(0,subdomains[len-1-i]); String k = sb.toString(); if(map.containsKey(k)) map.replace(k, map.get(k)+count); else map.put(k, count); } } List<String> result = new ArrayList<String>(); // map.forEach((k,v)->{ // StringBuilder sb = new StringBuilder(); // sb.append(v);sb.append(‘ ‘);sb.append(k); // result.add(sb.toString()); // }); Set<Map.Entry<String,Integer>> set = map.entrySet(); for(Map.Entry<String, Integer> e:set) { StringBuilder sb = new StringBuilder(); sb.append(e.getValue());sb.append(‘ ‘);sb.append(e.getKey()); result.add(sb.toString()); } return result; } }
之后还可以改进,在获得subdomain时,可以不用StringBuilder相加获得,可以通过substring方法获得,空间开支会小一些,时间开支也少了,方法3:
原文地址:https://www.cnblogs.com/chason95/p/9290047.html
时间: 2024-11-05 23:32:37