家人们,这道题算是给我涨了知识了,就是使用数组记录字符出现的次数的时候,千万不要排序!!! 因为我们是使用数组下标来和字符对应上的,如果进行排序,数组下标就变了,就和原来的字符对不上了。
我刚开始想的就是先记录每个字符出现的次数,然后排序,然后从大到小输出。然后就是光荣的错了。我也想过用HashMap,但是又想到HashMap不能排序,又放弃了,但是翻了题解以后才知道,我们可以用HashMap来记录字符出现的次数,然后使用list数组来进行排序,让list数组帮助HaspMap排序。这样就能完美地解决这道题了。
Map<Character, Integer> map = new HashMap<Character, Integer>();
int length = s.length();
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
int frequency = map.getOrDefault(c, 0) + 1;
map.put(c, frequency);
}
先使用HashMap来记录每个字符出现地次数
List<Character> list = new ArrayList<Character>(map.keySet());
//按照出现的次数从大到小排序
Collections.sort(list, (a, b) -> map.get(b) - map.get(a));
StringBuffer sb = new StringBuffer();
int size = list.size();
先将得到的key的集合转化为list,然后按照HashMap中key所对应的value进行排序,这样list中的字符就是按照出现的频率由大到小排的了。
for (int i = 0; i < size; i++) {
char c = list.get(i);
int frequency = map.get(c);
for (int j = 0; j < frequency; j++) {
sb.append(c);
}
}
return sb.toString();
按照list的顺序,得到字符以及字符出现的频率,将其与sb连接,最后将sb转化为Strirng返回。
class Solution {
public String frequencySort(String s) {
//使用map集合将字符与其出现的次数对应起来
Map<Character, Integer> map = new HashMap<Character, Integer>();
int length = s.length();
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
int frequency = map.getOrDefault(c, 0) + 1;
map.put(c, frequency);
}
List<Character> list = new ArrayList<Character>(map.keySet());
//按照出现的次数从大到小排序
Collections.sort(list, (a, b) -> map.get(b) - map.get(a));
StringBuffer sb = new StringBuffer();
int size = list.size();
//直接取出来进行连接
for (int i = 0; i < size; i++) {
char c = list.get(i);
int frequency = map.get(c);
for (int j = 0; j < frequency; j++) {
sb.append(c);
}
}
return sb.toString();
}
}