451. 根据字符出现频率排序
输入:
“tree”
输出:
“eert”
解释:
'e’出现两次,'r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。
来源:力扣(LeetCode)
###1.要用到StringBuffer的添加方法
首先复习字符串方法。
StringBuffer 长度和内容可变
StringBuffer sb=new StringBuffer(50);
sb.capacity();//容量50;
sb.length();//长度为0;
StringBuffer sb2=new StringBuffer("hello");
sb3.capacity();//容量21;
sb3.length();//长度为5;
//2.StringBuffer的添加功能
StringBuffer sb3=new StringBuffer();
sb3.append("hello");
sb3.append("world"); //helloworld;
//3.StringBuffer的插入功能;
sb.insert(5,666);//hello666world;
###2.要用到Map的方法(利用Map统计数组中重复个数)
利用map的特性可以储存键值对
//注意声明字符数组的格式!!!
String[] arr =new String[]{"a","b","a","b"};
Map<String,Integer>map = new HashMap<>();
//接口的引用指向实现类的对象 可以理解为向上转型
for(String str:arr){
Integer num = map.get(str);
if(num = null){
map.put(str,1);
}else{
map(str,num+1);
}
}
//遍历
Set set = map.entrySet();
//entrySet就是把(KEY-VALUE)一对一对的放入Set集合中
Iterator it =set.itrator();
//entrySet进行迭代,存放到迭代器中
//Iterator就像指针一样,next()就能找到它的下一个元素。
while(it.hasNext()){
Map.Entry<String,Integer> entry =(Entry<String,Integer>)it.next();
//Map.Entry是Map的一个内部接口。
System.out.println("单词"+entry.getKey()+"出现次数:"+entry.getValue());
}
3.把字符串分割成字符数组
String str="tree";
String[] arr = str.split("");
for(String s:arr) {
System.out.println(s);
}
###4.Map按值排序
Collections 是一个工具类,sort是静态方法
作用: 对list进行排序
//转化成list
List<String> list = new ArrayList<>(map.keySet());
Collections.sort(list, (a, b) -> map.get(b) - map.get(a));
题解:
class Solution {
public String frequencySort(String s) {
String[] arr = s.split("");
Map<String,Integer>map =new HashMap<>();
for(String str:arr) {
Integer num = map.get(str);
if(num==null) {
map.put(str, 1);
}else {
map.put(str, num+1);
}
}
//转换成String类型的list
List<String> list = new ArrayList<>(map.keySet());
//降序 排序
Collections.sort(list, (a, b) -> map.get(b) - map.get(a));
StringBuffer bf = new StringBuffer();
int size = list.size();
for(int i = 0;i<size ;i++){
String c = list.get(i);
int num = map.get(list.get(i));
for(int j = 0;j<num;j++){
bf.append(c);
}
}
return bf.toString();
}
}