Loading

451. [字符串][哈希表][堆]根据字符出现频率排序

451. 根据字符出现频率排序

看到这题,我的第一反应是用一个HashMap记录字符串中字符出现的频率,然后通过重写compare接口实现HashMap依照value的值排序key,最后使用StringBuffer组装新的字符串。具体算法见代码。

// 执行用时: 17 ms , 在所有 Java 提交中击败了 64.46% 的用户 
// 内存消耗: 39.7 MB , 在所有 Java 提交中击败了 77.88% 的用户

class Solution {
    public String frequencySort(String s) {
        Map<Character, Integer> hashMap = new HashMap<>();
        for(int i = 0; i < s.length(); i++){
            hashMap.put(s.charAt(i), hashMap.getOrDefault(s.charAt(i), 0)+1);
        }

        List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(hashMap.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
            @Override
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        StringBuffer sb = new StringBuffer();
        for (Map.Entry<Character, Integer> mapping : list) {
            char c = mapping.getKey();
            int time = mapping.getValue();
            for(int i = 0; i < time; i++){
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

然而,这样做的效率是不高的,

posted @ 2020-10-24 12:17  上海井盖王  阅读(91)  评论(0)    收藏  举报