1.问题描述:

给定一组数据num,以及一个整数k,找出其中所有出现频度大于n/k的元素


2.分析:

因为要出现频度大于n/k 那么就说明 当前数组中只有k-1个这样的数字,因为 n/k * (k) = n故最多只有k-1个数字的频度大于n/k


3.算法思路:

建立一个hashMap,其中key为要选出的数字,value为他们在数组中出现的频度

  1. 通过遍历整个数组,如果当前遍历到的数字 已经存入进了hashMap表中,那么就将他的value+1
  2. 如果当前遍历到的数字没有出现在hashMap中而且 hashMap还没有满,那么就将当前的数字添加到hashMap中;
  3. 如果当前的遍历到的数字没有出现在hashMap中而且hashMap已经满了,那么就将hashMap中的所有元素的value值都 减一 如果有元素的value值在减一后变为0那么就将当前的该元素移除掉
  4. 当整个数组全部遍历过一次之后,就应该对当前的hashMap中存的数进行检验。检查他们出现的频度
  5. 最后检查完所有的数字之后,将真正出现频度大于n/k的数加入到res集合中返回

4.代码 :

  //    大于n/k的频度的数 最多只有k-1个public List<Integer> findOverKTimes(int[] num, int k) {if (num == null || num.length < k) {return null;}
//        用哈希表来记录最多的k-1个数 并且在arr数组中出现的次数HashMap<Integer, Integer> hashMap = new HashMap<>();
//        遍历整个数组for (int i = 0; i < num.length; i++) {
//            当遍历到arr[i]的时候 已经在hashMap中了if (hashMap.containsKey(num[i])) {hashMap.put(num[i], hashMap.getOrDefault(num[i], 0) + 1);}
//            不在hashMap中,并且当前的hashMap还没有满(没有找到k-1个数)else if (hashMap.size() < k - 1) {hashMap.put(num[i], 1);}
//            当前hashMap已经满了说明已经发现了k个不同的数,那么就将hashMap中的所有数的出现次数全部-1 并且当前的数字也不要
//            如果当前的hashMap中有元素的出现次数在 - 1后变为0那么hashMap重新变为不满的状态else {allDeleteOne(hashMap);}}List<Integer> res = new ArrayList<>();
//        在遍历完整个数组后需要进行验证,判断当前的数组是否真的出现次数大于n/k次HashMap<Integer, Integer> realRes = getRealRes(num, hashMap);for(int key : realRes.keySet()){Integer value = realRes.get(key);
//            如果得到的验证之后的出现频率是大于 n/k的那么就将当前的数字添加到res结果集中if(value > num.length/k){res.add(key);}}return res;}//    hashMap中的所有元素的出现次数全部都减一public void allDeleteOne(HashMap<Integer, Integer> hashMap) {Set<Integer> keys = hashMap.keySet();for (int key : keys) {int value = hashMap.get(key);
//            如果出现的次数为1那么就将当前的元素移除 让hashMap重新变回不满的状态if (value == 1) {hashMap.remove(key);} else if (value > 1) {hashMap.put(key, value - 1);}}}//    对得出的结果进行验证public HashMap<Integer,Integer> getRealRes(int[] num, HashMap<Integer, Integer> hashMap) {
//        realRes中存的是 之前演算出来的数组,和在数组中真正出现的次数HashMap<Integer,Integer> realRes = new HashMap<>();for (int key : hashMap.keySet()) {int count = 0;
//            遍历整个数组 只要当前的数是hashMap得到的当前的元素 那么count++for(int i =0;i<num.length;i++){if(num[i] == key) {count++;}}realRes.put(key,count);}return realRes;}

找出数组中所有出现次数大于n/k的元素相关推荐

  1. 找出数组中只出现1次的两个元素

    通过位运算可以得到只出现1次的唯一元素,但是如果有两个元素出现1次,则需要更进一步. 对整个数组依次进行异或运算后,得到的是两个出现一次元素的异或,之后将这两个元素的最后面是1的位记录下来,并以此为标 ...

  2. java数组出现次数最多的数_找出数组中出现次数最多的那个数——主元素问题...

    方法一:以空间换时间,可以定义一个计数数组int count[101],用来对数组中数字出现的次数进行计数(只能针对数组中数字的范围1~100),count数组中最大的元素对应的下标,即为出现次数最多 ...

  3. 找出数组中出现次数超过一半的数

    算法--找出数组中出现次数超过一半的数      每当我看到经典的算法题,就怀念高中,感觉很多算法题就是高中的题目,谁叫哥只读了个专科,高数基本相当没学.      有空要看看高数啊,想当年数学那是相 ...

  4. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...

    matlab中如何找出不同维度矩阵出现次数最多的数组并记录其个数 首先是胞矩阵中的序列问题,不妨假设AA{1}是一个多行两列的数据,AA{2}同例.程序如下clcclearallAA{1}=[12;2 ...

  5. 利用HashMap找出数组中出现次数最多的元素及其次数

    我在牛客网上刷题时遇到了这道题目,因为初学Java不久,对Java的应用还不熟悉,刚开始用C语言做没做出来(我太菜了...),接着百度发现竟然可以用HashMap做,仔细一想发现这真是一个好办法(为什 ...

  6. 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

    笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...

  7. 【菜鸡新手 - 剑指offer 03】[2021/1/17一刷] 找出数组中重复的数字 -三种解法|| 物归原主,测试碰撞法 || hash表测试碰撞法 || 排序+遍历法 ||python

    文章目录 题目解读 A. 书籍推荐解法:我起名为" 物归原主,测试碰撞"法 B. 基础尝试1:hash表 + 碰撞测试 (效果还行) C. 基础尝试2:排序+遍历 (效果差) C. ...

  8. 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素...

    /**  * 功能:给定一个排序后的数组.包括n个整数.但这个数组已被旋转过多次,次数不详.找出数组中的某个元素.  * 能够假定数组元素原先是按从小到大的顺序排列的.  */ /*** 思路:数组被 ...

  9. 微策略2011校园招聘笔试题(找出数组中两个只出现一次的数字)

    1.8*8的棋盘上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0),一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下 ...

最新文章

  1. 深度学习(四)卷积神经网络Lenet-5实现
  2. Hibernate中的merge使用详情解说
  3. centeros7安装mysql - 风中追风_lonely - 博客园
  4. 读取串口 :javax.comm 2.0 windows下Eclipse的配置
  5. 通过xshell在linux上安装mysql5.7(终极版)
  6. API的过去,现在与未来
  7. express给html设置缓存,webpack+express实现文件精确缓存的示例代码
  8. 对代码更有信心--单元测试工具Mockito简单介绍
  9. goaccess分析nginx日志
  10. 操作系统-UNIX三级索引技术
  11. 使用 URL 读取网络资源
  12. 1853: [Scoi2010]幸运数字[容斥原理]
  13. 男同胞要一定要看——酒桌上用来劝酒的话
  14. AI实战:目标检测模型应用之生活垃圾图片分类
  15. 2021年华为杯数学建模比赛——二分类与回归问题(1)
  16. Java趣味编程(一)
  17. 如何用svg画一个骚气的名字
  18. if-else if语句与多if语句
  19. 单正态总体的样本均值和样本方差的分布
  20. java jxl 筛选_JAVA 用 JXL导出excel怎么给标题设置自动筛选功能,求代码。

热门文章

  1. 新鲜!宁盾dKey手机动态口令牌简介
  2. 深划痕需要大面积补漆吗_什么程度的划痕才需要做补漆?小心亏大了!
  3. 微信实时监测室内环境
  4. “终极PK”终告落幕,DEMO GOD花落谁家?
  5. D. Felicity's Big Secret Revealed dp
  6. MRO采购对酒店业务的重要性
  7. OpenCV+Visual Studio配置及测试 (没有做不成的事)
  8. hutool导出excel大数据_Hutool excel导出并合并单元格
  9. 睡眠实验记录:探索自己的最佳睡眠时长及方式,提高睡眠效率
  10. 想学习CAD制图?对于初学CAD应该注意什么?