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();
}
}
然而,这样做的效率是不高的,

浙公网安备 33010602011771号