题目

在数组中找到出现次数大于N/K 的数

java代码

package com.lizhouwei.chapter8;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* @Description: 在数组中找到出现次数大于N/K 的数
* @Author: lizhouwei
* @CreateDate: 2018/5/7 19:58
* @Modify by:
* @ModifyDate:
*/
public class Chapter8_6 {
public void printHalfMajor(int[] arr) {
int cand = 0;
int times = 0;
for (int i = 0; i < arr.length; i++) {
if (times == 0) {
cand = arr[i];
times++;
} else if (cand == arr[i]) {
times++;
} else {
times--;
}
}
times = 0;
for (int i = 0; i < arr.length; i++) {
if (cand == arr[i]) {
times++;
}
}
if (times > arr.length / 2) {
System.out.println("超过一半的元素为:" + cand);
}
} public void printKMajor(int[] arr, int k) {
Map<Integer, Integer> map = new HashMap<>();
int item = 0;
for (int i = 0; i < arr.length; i++) {
item = arr[i];
if (map.containsKey(item)) {
map.put(item, map.get(item) + 1);
} else if (map.size() ==k - 1) {
allCandMinusOne(map);
} else {
map.put(item, 1);
}
}
Map<Integer, Integer> resultMap = getReals(arr, map);
System.out.print("个数超过" + arr.length / k + "的元素为:");
for (Integer key : resultMap.keySet()) {
if (resultMap.get(key) > arr.length / k) {
System.out.print(key + " ");
}
} } public void allCandMinusOne(Map<Integer, Integer> map) {
List<Integer> removeList = new ArrayList<>();
for (Integer key : map.keySet()) {
map.put(key, map.get(key) - 1);
if (map.get(key) == 0) {
removeList.add(key);
}
}
for (Integer key : removeList) {
map.remove(key);
}
} public Map<Integer, Integer> getReals(int[] arr, Map<Integer, Integer> map) {
Map<Integer, Integer> reals = new HashMap<>();
int item = 0;
for (int i = 0; i < arr.length; i++) {
item = arr[i];
if (map.containsKey(item)) {
if (reals.containsKey(item)) {
reals.put(item, reals.get(item) + 1);
} else {
reals.put(item, 1);
}
}
}
return reals;
} //测试
public static void main(String[] args) {
Chapter8_6 chapter = new Chapter8_6();
int[] arr = {1, 2, 2, 2, 2, 2, 3, 3};
System.out.print("数组{1, 2,2, 2, 2, 3, 3}中");
chapter.printHalfMajor(arr);
int[] arr1 = {1, 2, 2, 2, 2, 3, 3, 3, 3};
System.out.print("数组{1, 2, 2, 2, 2, 3, 3, 3, 3}中");
chapter.printKMajor(arr1,4); }
}

结果

《程序员代码面试指南》第八章 数组和矩阵问题 在数组中找到出现次数大于N/K 的数的更多相关文章

  1. [算法]在数组中找到出现次数大于N/K的数

    题目: 1.给定一个整型数组,打印其中出现次数大于一半的数.如果没有出现这样的数,打印提示信息. 如:1,2,1输出1.    1,2,3输出no such number. 2.给定一个整型数组,再给 ...

  2. 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree

    题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...

  3. 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串

    题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...

  4. 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节

    [题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...

  5. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  6. 在数组中寻找出现次数大于N/K的数

    给定一个int[]数组,给定一个整数k,打印所有出现次数大于N/k的数,没有的话,给出提示信息. === 核心思想:一次在数组中删除K个不同的数,不停的删除,直到剩下的数的种类不足K就停止删除,那么如 ...

  7. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  8. [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)

    题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...

  9. 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数

    题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...

随机推荐

  1. phpexcel设置所有单元格的默认对齐方式

    代码如下,从国外论坛上找到的 $objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Styl ...

  2. hdu1070(C++)

    本题在于求单价,即为每一天(每200升牛奶)要多少钱,注意超过1000的当做5天,不足200的忽略 #include<iostream> #include<string> us ...

  3. NV 3D投影方案 【转】

    http://tu.pcpop.com/all-677013.htm 1/8 NVIDIA 3D方案涉及图形处理器(GPU).信号发射器.快门式3D眼镜.3D播放软件以及经过NVIDIA认证的显示器. ...

  4. 2016.8.19 在dialog上增加一个button出现错误:failed to execute setAttribute on Element...

    目标:想要在dialog上多加一个button. 语法来自: http://api.jqueryui.com/dialog/#option-buttons   可见新增在dialog上的button要 ...

  5. 接口性能测试方案 白皮书 V1.0

    一. 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间.响应时间按软件的特点再可以细分,如对于一个 C/S 软件的响应时间可以细分为网 ...

  6. OCP学习基本知识点总结

     下面是我总结的OCP教程的知识点.以备參考之用. 1, What's Oracle Server? ·         It's a database management system that ...

  7. poj1649 Rescue(BFS+优先队列)

    Rescue Time Limit: 2 Seconds      Memory Limit: 65536 KB Angel was caught by the MOLIGPY! He was put ...

  8. hdfs笔记

    Distributed File System 数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文 ...

  9. 在VS2013中打开Nuget

    1.工具→NuGet程序包管理器→程序包管理控制台 2.没有的话,就去  工具→扩展和更新   搜索nuget

  10. PHP如何识别系统语言或浏览器语言

    preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches); $lang = $matches[1]; switc ...