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.Method1:
public String frequencySort(String s) {
if(s.length()<3) return s;
int max = 0;
int[] map = new int[256];
for(char ch: s.toCharArray()){
map[ch]++;
max = Math.max(max,map[ch]);
}
String[] buckets = new String[max+1];
for(int i=0;i<256;i++){
String str = buckets[map[i]];
if(map[i]>0)
buckets[map[i]]=(str==null)?"" + (char)i:(str + (char) i);
}
StringBuilder strb = new StringBuilder();
for(int i=max;i>=0;i--){
if(buckets[i]!=null)
for(char ch:buckets[i].toCharArray())
for (int j=0;j<i;j++)
strb.append(ch);
}
return strb.toString();
}
总结:利用桶排序,将出现次数相同的字符放在同一个桶中。利用map也能实现。
Method2:
public String frequencySort(String s) {
if(s.length()<3) return s;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
char [] array = s.toCharArray();
int max = 0;
for(int i=0;i<array.length;i++){
if(!map.containsKey(array[i])) map.put(array[i], 0);
map.put(array[i], map.get(array[i])+1);
max = Math.max(max,map.get(array[i]));
}
List<Character>[] arrayList = new List[max+1];
for(Character c: map.keySet()){
int count = map.get(c);
if(arrayList[count]==null) arrayList[count] = new ArrayList();
arrayList[count].add(c);
}
StringBuilder result = new StringBuilder();
for(int i = max;i>0;i--){
List<Character> list = arrayList[i];
if(list!=null){
for(Character c:list){
for(int j=i;j>0;j--){
result.append(c);
}
}
}
}
return result.toString();
}
总结:利用map