力扣451 根据字符出现频率排序

在这里插入图片描述
在这里插入图片描述
   家人们,这道题算是给我涨了知识了,就是使用数组记录字符出现的次数的时候,千万不要排序!!! 因为我们是使用数组下标来和字符对应上的,如果进行排序,数组下标就变了,就和原来的字符对不上了。
   我刚开始想的就是先记录每个字符出现的次数,然后排序,然后从大到小输出。然后就是光荣的错了。我也想过用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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121342071