451. 根据字符出现频率排序
- 必备知识点:
- HashMap的方法
getOrDefault
:当map中存在c(key)时,输出对应的value,如果不存在c(key)时,则输出0。 - 遍历HashMap的方法。
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
char c = entry.getKey();
int frequency = entry.getValue();
}
- HashMap方法
keySet()
:返回 hashMap 中所有 key 组成的集合视图。 - List< Character> list = new ArrayList< Character>(map.keySet()) 的意思?:
表示将map.keySet()的内容复制到ArrayList中。new ArrayList< Character>();
表示引用ArrayList的构造方法,查看ArrayList的构造方法可知,可以给ArrayList传入一个集合,若为空则返回一个空集合。
桶排序+哈希表
代码实现:
class Solution {
public String frequencySort(String s) {
// 1. 将s的内容放入HashMap中,并统计最大频率。
// 2. 创建桶,并将HashMap中的元素放入桶中。
// 3. 取出桶中的内容,最后输出结果。
//目的是将字母出现的频率对应到哈希表中,其中key是字符,value表示字母出现频率。
HashMap<Character,Integer> h=new HashMap<>();
int maxquency=0;
//1.将s的内容放入HashMap中,并统计最大频率。
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
int frequecy =h.getOrDefault(c,0)+1;
h.put(c,frequecy);
maxquency = Math.max(maxquency,frequecy);
}
//2.1 创建桶。 桶的编号为字符出现的频率。
//创建一维数组,表示一共有多少个桶,桶的标号为字符频率。
StringBuffer []buckets=new StringBuffer[maxquency+1];
for(int i=0;i< buckets.length;i++){
//创建桶,每一个桶都是一个StringBuffer。
buckets[i]=new StringBuffer();
}
//2.2 将HashMap中的内容放入桶中。
//遍历HashMap。
for(Map.Entry<Character,Integer> e:h.entrySet()){
int frequency=e.getValue();
char c=e.getKey();
//向StringBuffer中加入元素,使用append方法。
buckets[frequency].append(c);
}
//3. 取出桶中的内容,最后输出结果。
StringBuffer sb=new StringBuffer();
for(int i=maxquency;i>=0;i--){
//表示遍历同一桶内元素的个数。
for(int j=0;j<buckets[i].length();j++){
//表示从同一桶内要取出同一元素几次。
for(int k=0;k<i;k++){
sb.append(buckets[i].charAt(j));
}
}
}
return sb.toString();
}
}