c++ map iterator 获取key_前K个高频的元素衍生之Map的Value与Key排序
前言
本篇文章总结来自九月份的每日一题
347-前K个高频的元素
思考
对于系列的题目就是计算利用到Hash表的属性的Key与Value的双属性,能够满足我们后面计算对于每一个元素出现的频率的同时还能够保存对于Key值的一一对应,能够让我们得以进行系列的计算与操作,其实对于Hash表的使用最明显的莫过于LeetCode的第一题:两数之和和其变形三数之和,都有利用到Hash来判断某一个值是否存在或者对其的Value进行系列的增加或删除操作,不需要我们进行遍历判断,且是线性。
思路
还是和之前一样,我们先对数组中的值进行频率的计算,对于不在数组其中的值对其的Value进行设置为1,对于已经存在数组其中的值对其的Value进行加一处理:
for(int value: nums){ if(map.containsKey(value)){ map.put(value,map.get(value)+1); } else{ map.put(value,1); }
在将所有的数据都存在Map中以后,剩下的就是如何将其中value值比较高的前K个取出来,也就转换成为了如何对Map中的Value进行排序处理?排序完成之后,就可以顺序取出来前K个也就是我们想要的前K高的元素。
代码
public int [] topKFrequent(int[] nums, int k) { int []num = new int[k]; Map map = new HashMap<>(); for(int value: nums){ if(map.containsKey(value)){ map.put(value,map.get(value)+1); } else{ map.put(value,1); } } List> list = new ArrayList<>(map.entrySet()); Collections.sort(list, new Comparator>() { @Override public int compare(Map.Entry o1, Map.Entry o2) { return o2.getValue()-o1.getValue(); } }); Map resultMap = new HashMap<>(); for(Map.Entry entry: list){ resultMap.put(entry.getKey(),entry.getValue()); } for(int i = 0 ;i
对Value排序
一想到这种并非是常规的数值的排序就想到了Collections.sort但是对于其来说接收的是List类型,于是我们就定义Map类型的List。
List> list = new ArrayList<>(map.entrySet());
解释:
对于Map.Entry来说就是Map中的一个接口,其是一个映射项,包含getKey和getValue方法
对于map.entrySet来说返回的而是Map中各个键值对映射关系的集合。
举个例子:
Iterator> it=map.entrySet().iterator(); while(it.hasNext()) { Map.Entry entry=it.next(); int key=entry.getKey(); int value=entry.getValue(); System.out.println(key+" "+value); }
有了如上的基础之后,因为我们的Collections.sort接收list类型的数据,所以我们在定义完成之后,就可以使用其进行对Value值的降序或者是升序的排列:
Collections.sort(list, new Comparator>() { @Override public int compare(Map.Entry o1, Map.Entry o2) { return o2.getValue()-o1.getValue();// 表示降序排列 return o1.getValue()-o2.getValue();// 表示升序排列 } });
扩展
当然这里对于Map中的数值接收的是int类型,但是有时候我们并不想对Map中的类型进行写死,想根据,输入的值的不同,进行不同的排序处理:
public static > Map SortedMap(Map map) { List> list = new ArrayList<>(map.entrySet()); Collections.sort(list, new Comparator>() { @Override public int compare(Map.Entry o1, Map.Entry o2) { return o1.getValue()-o2.getValue();// 升序 return o2.getValue()-o1.getValue();// 降序 } }); Map returnMap = new LinkedHashMap(); for (Map.Entry entry : list) { returnMap.put(entry.getKey(), entry.getValue()); } return returnMap; }
测试
int类型数据
测试数据:
Map map = new HashMap<>(); map.put("Tom",2); map.put("Jack",1); map.put("sun",4); map.put("star",21); System.out.println("排序前--->" + map); System.out.println("----------------"); map = SortedMap(map); System.out.println("排序后--->" + map);
测试结果:
排序前--->{Tom=2, star=21, Jack=1, sun=4}----------------排序后--->{star=21, sun=4, Tom=2, Jack=1}
String类型数据
测试数据:
Map map = new HashMap<>(); map.put("Tom","azc"); map.put("Jack","bac"); map.put("sun","bzc"); map.put("star","abc"); System.out.println("排序前--->" + map); System.out.println("----------------"); map = SortedMap(map); System.out.println("排序后--->" + map);
测试结果:
排序前--->{Tom=azc, star=abc, Jack=bac, sun=bzc}----------------排序后--->{sun=bzc, Jack=bac, Tom=azc, star=abc}
对Key排序
在完成了对Value的排序以后来进行系列的对Key值的排序处理。对于Key值的排序就比较容易实现了。
public static > Map SortedKey(Map map){ K [] key = (K[]) map.keySet().toArray(); Arrays.sort(key); Map returnMap = new LinkedHashMap<>(); for(K keys : key){ returnMap.put(keys,map.get(keys)); } return returnMap; }
测试
String类型数据
测试数据:
Map map = new LinkedHashMap<>(); map.put("azc", "a"); map.put("abc", "b"); map.put("bzc", "d"); map.put("bac", "e"); System.out.println("排序前--->" + map); System.out.println("----------------"); map = SortedKey(map); System.out.println("排序后--->" + map);
测试结果:
排序前--->{azc=a, abc=b, bzc=d, bac=e}----------------排序后--->{abc=b, azc=a, bac=e, bzc=d}
c++ map iterator 获取key_前K个高频的元素衍生之Map的Value与Key排序相关推荐
- LeetCode——347. 前 K 个高频元素【最小堆实现】
LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...
- 算法:前K个最大的元素
前几天,阮一峰 和 winter 在前端九部组织了一个互面小组,目的是为了分享和解答面试遇到的面试题,感兴趣的可以了解一下. 下面我就把我回答的一个问题整理出来分享给大家. 问题描述 题目是:算法,前 ...
- 用Java输出高频词_Java实现 LeetCode 692 前K个高频单词(map的应用)
692. 前K个高频单词 给一非空的单词列表,返回前 k 个出现次数最多的单词. 返回的答案应该按单词出现频率由高到低排序.如果不同的单词有相同出现频率,按字母顺序排序. 示例 1: 输入: [&qu ...
- 215.数组中的第K个最大元素/347. 前 K 个高频元素
2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...
- 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements
leetcode347题目链接:https://leetcode.cn/problems/top-k-frequent-elements 目录 一.题目描述 二.思路 1.什么是优先级队列呢? 2.什 ...
- (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)
目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...
- 算法题——前K个高频单词
每日刷题LeetCode--692. 前K个高频单词 给一非空的单词列表,返回前 k 个出现次数最多的单词. 返回的答案应该按单词出现频率由高到低排序.如果不同的单词有相同出现频率,按字母顺序排序. ...
- 前K个高频元素(top k)(TX)
思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计. 然后是对频率进行排序,这里我们可 ...
- 统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素
本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一. 个人网站:https://www.cxyxiaowu.com 今天分享的题目来源于 LeetCode 上第 347 号问题: ...
最新文章
- Windows7无法自动将IP协议堆栈绑定到网络适配器的办法
- 教你设计一个超牛逼的本地缓存!
- 云计算的7种变化方式
- 关于微信聊天记录双击弹出具体显示内容的效果
- 【每天一道算法题】Numeric Keypad
- 全国计算机等级考试题库二级C操作题100套(第37套)
- linux内核设计与实现---进程管理
- 实战02_SSM整合ActiveMQ支持多种类型消息
- 最优化学习笔记(十六)——拟牛顿法(2)
- 信息学奥赛一本通 1043:整数大小比较 | OpenJudge NOI 1.4 05
- HDU-4631 Sad Love Story 平面最近点对
- UVA11040 Add bricks in the wall【数学】
- Atitit 提升开发效率 通道化驱动化数据操作与查询 目录 1. xiaoguo	1 1.1. Atitit mybatis 简化开发与提升开发效率法	1 2. Code	1 3. ref	4
- midl会议_医学图像分析相关的会议
- 大白用html5制作,别再选择单调的大白墙了,白墙这样设计,墙面丰富有质感!...
- 1、唯交易的市场不会偏差,2、期权对冲股票市值张数和权利金计算
- 打造个人的云技术乐园
- 计算机网络——IP协议基础原理
- php获得屏幕宽度,PHP获取客户端屏幕宽度、高度及分辨率的方法
- 从逻辑分区中划出主分区
热门文章
- windows系统服务器数据库,windows系统的服务器肿么访问数据库
- oracle 复制表方法,(转)oracle数据库之间 表复制方法一(extent 方法)
- ajax更新,AJAX网址更新(AJAX URL update)
- ubuntu windows 终端清理、清空 屏幕命令 清屏
- 十一、FCFS(先来先服务)、SJF(短作业优先)、HRRN(高响应比优先)
- 【统计学习方法】线性可分支持向量机对鸢尾花(iris)数据集进行二分类
- OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks
- CSDN-markdown编辑器
- LeetCode 961 N-Repeated Element in Size 2N Array --python,java解法
- 查询前10条_阿里开发强制要求的10条ORM映射查询规范,开发人员值得看