您的位置:首页 > 产品设计 > UI/UE

451. Sort Characters By Frequency

2017-03-16 17:16 447 查看
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.

public class Solution {
public String frequencySort(String s) {
if (s == null) return "";
int max = 0;
char[] charArray = s.toCharArray();
HashMap<Character, Integer> map = new HashMap();
for (char c : charArray) {
if (!map.containsKey(c)) {
map.put(c, 0);
}
map.put(c, map.get(c)+1);
max = Math.max(max, map.get(c));
}
List<Character>[] lists = buildList(map, max);
return buildString(lists);

}
public List<Character>[] buildList(HashMap<Character, Integer> map, int max) {
List<Character>[] res = new ArrayList[max+1];
for (Character c : map.keySet()) {
int idx = map.get(c);
if(res[idx] == null) {
res[idx] = new ArrayList<Character>();
}
res[idx].add(c);
}
return res;
}
public String buildString(List<Character>[] lists){
StringBuilder sb = new StringBuilder();
for (int i = lists.length-1; i >= 0; i--) {
if(lists[i] != null) {
for (Character c : lists[i]) {
for (int j = i; j > 0; j--) {
sb.append(c);
}
}
}
}

return sb.toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: