《程序员代码面试指南》第八章 数组和矩阵问题 在数组中找到出现次数大于N/K 的数
题目
在数组中找到出现次数大于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 的数的更多相关文章
- [算法]在数组中找到出现次数大于N/K的数
题目: 1.给定一个整型数组,打印其中出现次数大于一半的数.如果没有出现这样的数,打印提示信息. 如:1,2,1输出1. 1,2,3输出no such number. 2.给定一个整型数组,再给 ...
- 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree
题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...
- 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串
题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...
- 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节
[题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
- 在数组中寻找出现次数大于N/K的数
给定一个int[]数组,给定一个整数k,打印所有出现次数大于N/k的数,没有的话,给出提示信息. === 核心思想:一次在数组中删除K个不同的数,不停的删除,直到剩下的数的种类不足K就停止删除,那么如 ...
- 程序员代码面试指南 IT名企算法与数据结构题目最优解
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...
- [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)
题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...
- 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数
题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...
随机推荐
- ADO.NET访问Access(文本数据库)数据操作(CRUD)
1,ADO.NET访问Access(文本数据库)数据操作(CRUD) 2,DatabaseDesign 文本数据库Northwind.mdb 3,/App_Code 3.1,/App_Code/DBC ...
- NormalMap 贴图 [转]
转载: http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.html 说起Normal Map(法线贴图),就 ...
- GIS可视化——麻点图
一.引言 目前在客户端绘制POI(Point of Interest,兴趣点)的方式主要是div(Marker的形式).svg.canvas.VML(后边三种就是Vector Layer)几种方式,这 ...
- Hadoop部署启动异常问题排查
hadoop的日志目录(/home/hadoop/app/hadoop-2.6.4/logs) 1.hadoop启动不正常用浏览器访问namenode的50070端口,不正常,需要诊断问题出在哪里: ...
- mootools客户端框架
mootools客户端框架 学习:http://www.chinamootools.com/ 官网:https://mootools.net/ 下载地址: https://github.com/moo ...
- Mockito 如何 mock 返回值为 void 的方法
转载:https://unmi.cc/mockito-how-to-mock-void-method/#more-7748 最初接触 Mockito 还思考并尝试过如何用它来 mock 返回值为 vo ...
- apache TIME_WAIT解决办法
最近发现apache与负载均衡器的的连接数过多,而且大部分都是TIME_WAIT,调整apache2.conf后也没效果,最后百度到如下解决方案 通过调整内核参数解决 vi /etc/sysctl.c ...
- (转)微信小程序开发项目——笑话大全
此项目是学习完微信小程序后实现的一个demo,采用聚合数据的免费api获取最新的文本笑话和趣图(图片和gif图) 项目地址:https://github.com/zhijieeeeee/wecha ...
- TP如何进行批量查询
public function getUserInfo($uid){ if(is_null($uid) || empty($uid)){return false;} if(is_arr ...
- Android使用OKHttp3实现下载(断点续传、显示运行进度)
OKHttp3是现在很流行的Android网络请求框架,那么怎样利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用R ...