Leetcode811 Subdomain Visit Count

由于不熟悉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:

猜你喜欢

转载自www.cnblogs.com/chason95/p/9290047.html