700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 找出数组中所有出现次数大于n/k的元素

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

时间:2018-12-11 14:05:56

相关推荐

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

1.问题描述:

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

2.分析:

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

3.算法思路:

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

通过遍历整个数组,如果当前遍历到的数字 已经存入进了hashMap表中,那么就将他的value+1如果当前遍历到的数字没有出现在hashMap中而且 hashMap还没有满,那么就将当前的数字添加到hashMap中;如果当前的遍历到的数字没有出现在hashMap中而且hashMap已经满了,那么就将hashMap中的所有元素的value值都 减一 如果有元素的value值在减一后变为0那么就将当前的该元素移除掉当整个数组全部遍历过一次之后,就应该对当前的hashMap中存的数进行检验。检查他们出现的频度最后检查完所有的数字之后,将真正出现频度大于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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。