451_根据字符出现频率排序

简介: 451_根据字符出现频率排序

451_根据字符出现频率排序

 

package 队列.优先级队列;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
/**
 * https://leetcode-cn.com/problems/sort-characters-by-frequency/
 * 
 * @author Huangyujun
 *
 *         出现频率:哈希表【当前字母 ,次数】 优先队列【】
 */
public class _451_根据字符出现频率排序 {
    /**
     * 官网解法:与我相比://取出所有的key【字符】构成一个集合,【通过map.get(字符)】进行降序排序 List<Character> list =
     * new ArrayList<Character>(map.keySet()); Collections.sort(list, (a, b) ->
     * map.get(b) - map.get(a));
     * 
     * @author Huangyujun
     *
     */
    class Solution2 {
        public String frequencySort(String s) {
            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);
            }
            // 取出所有的key【字符】构成一个集合,【通过map.get(字符)】进行降序排序
            // 然后 stringBuffer 进行拼接
            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();
        }
    }
    /**
     * 我卡壳的解法:缺少了一些知识储备:通过entrySet 取到结点集合
     * ArrayList<Character>(map.keySet()); Collections.sort(list, (a, b) ->
     * map.get(b) - map.get(a));
     */
//    public String frequencySort(String s) {     
//        HashMap<Character, Integer> map = new HashMap<>();
//        int len = s.length();
//        for(int i = 0; i < len; i++) {
//            Character ch = s.charAt(i);
//            if(map.containsKey(ch)) {
//                int count = map.get(ch);
//                map.put(ch, count);
//            }else {
//                map.put(ch, 1);
//            }
//        }
//        StringBuffer sb = new StringBuffer();
//        int size = map.size();//无法通过value得到key呀, 通过keySet 拿出所有的 key构成集合,然后,通过工具类Collections 进行排序
//        for(int i = 0; i < size - 1; i++) {
//            //假设当前是最大数
//            int count = map.get(i);
//        
//            for(int j = 1; j < size; j++) {
//                if(count < map.get(j)) {
//                    count = map.get(j);
//                }
//            }
//            
//        }
//        return null;        
//    }
}
目录
相关文章
|
安全 程序员 编译器
C++程序中的基类与派生类转换
C++程序中的基类与派生类转换
148 1
|
自然语言处理
ESM规范在编译阶段如何确定模块的依赖关系
ESM规范在编译阶段如何确定模块的依赖关系
|
监控 Shell Perl
k8s诊断之ingress 异常状态码及证书问题排查思路
ingress的状态码以及证书问题的分析
1157 0
|
消息中间件 缓存 负载均衡
一文讲透 RocketMQ 消费者是如何负载均衡的
RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )。 集群消费:同一 Topic 下的一条消息只会被同一消费组中的一个消费者消费。也就是说,消息被负载均衡到了同一个消费组的多个消费者实例上。
|
域名解析 缓存 网络协议
揭秘浏览器键入URI到页面显示的过程: 浏览器键入URI,到页面显示,中间发生什么?
揭秘浏览器键入URI到页面显示的过程: 浏览器键入URI,到页面显示,中间发生什么?
106 0
WebSocket学习笔记 -- 环境搭建2
WebSocket学习笔记 -- 环境搭建2
121 0
|
JavaScript Windows
创建Vue项目时遇到的问题与错误
创建Vue项目时遇到的问题与错误
349 0
干货|移动端App自动化之触屏操作自动化
工作中我们经常需要对应用的页面进行手势操作,比如滑动、长按、拖动等,AppiumDriver 为我们提供一个模拟手势操作的辅助类 TouchAction,可以通过它对手机屏幕进行手势操作。 具体用法参见链接:https://ceshiren.com/t/topic/3275 ## 导入TouchAction ``` from appium.webdriver.common.touch_ac
|
Web App开发 JSON .NET
ASP.NET Web API(一):使用初探,GET和POST数据
概述 REST(Representational State Transfer表述性状态转移)而产生的REST API的讨论越来越多,微软在ASP.NET中也添加了Web API的功能。 我们看dudu的文章HttpClient + ASP.NET Web API, WCF之外的另一个选择知道了博客园也开始使用了Web API,且在使用Web API Beta版本的时候遇到了这个问题:痴情意外:ASP.NET WebAPI RC 竟然不支持最常用的json传参。
1072 0