Given a string, sort it in decreasing order based on the frequency of characters.
Example 1:
Input: "tree" Output: "eert" Explanation: 'e' appears twice while 'r' and 't' both appear once. So 'e' must appear before both 'r' and 't'. Therefore "eetr" is also a valid answer.
Example 2:
Input: "cccaaa" Output: "cccaaa" Explanation: Both 'c' and 'a' appear three times, so "aaaccc" is also a valid answer. Note that "cacaca" is incorrect, as the same characters must be together.
Example 3:
Input: "Aabb" Output: "bbAa" Explanation: "bbaA" is also a valid answer, but "Aabb" is incorrect. Note that 'A' and 'a' are treated as two different characters.
这道题一看是很简单,但是里面有很多点可以考察
解法:
1. 首先遍历String里的每一个字符,统计其个数,存在HashMap里。那么map的key,value类型即为 <Character, Integer>
举例 如果是tree,那么map最后为
t-> 1
r-> 1
e-> 2
这里没有用TreeMap, 因为TreeMap虽然可以加一个Comparator,但是只能对Key进行排序,而不能对Value排序。根据题意,我们要基于字符出现的个数来输出字符串。所以普通的HashMap即可以。
2. 取出Map里的EntrySet,也就是一个Key-Value的集合,用它构建出来一个List
3. 用Collections.sort方法,把List排序,代码里v2-v1是因为我们需要大数在前。如果v1-v2则小的在前,大的在后。
现在list:
e->2
r->1
t->1
4. 对于list的每个item,StringBuilder append相应的个数
结果为eert
这里是java hashmap sort key,value的例子
public String frequencySort(String s) {
if(s==null) return null;
HashMap<Character,Integer> map=new HashMap<>();
for(int i=0;i<s.length();i++){
char c= s.charAt(i);
int count=1;
if(map.containsKey(c)){
count=map.get(c)+1;
}
map.put(c,count);
}
List<Map.Entry<Character, Integer>> listOfEntries = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet());
Collections.sort(listOfEntries,new Comparator<Map.Entry<Character,Integer>>()
{ @Override public int compare(Map.Entry<Character,Integer> e1, Map.Entry<Character,Integer> e2)
{ int v1 = e1.getValue(); int v2 = e2.getValue(); return v2-v1; } });
StringBuilder builder=new StringBuilder();
for(Map.Entry<Character,Integer> pair :listOfEntries) {
for (int i = 1; i <=pair.getValue(); i++) {
builder.append(pair.getKey());
}
}
return builder.toString();
}