《程序员代码面试指南》第八章 数组和矩阵问题 在数组中找到出现次数大于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 次的数组 ...
随机推荐
- GLSL 基础量定义 【转】
转载:http://blog.csdn.net/misol/article/details/7658949 GLSL语法跟C语言非常相似: 1.数据类型: GLSL包含下面几种简单的数据类型 fl ...
- 微信开发token验证失败
遇到token验证时: 1.首先检验是否是80端口或443端口,能否接收到微信的响应信息,如果使用域名,域名要备注,否则接收不到响应信息: 2.其次判断是否能正常echo $echoStr,之前不能有 ...
- java查看工具jstack-windows
Prints Java thread stack traces for a Java process, core file, or remote debug server. This command ...
- TP多条件查询
$stcount = M("Results_all")->alias('a') ->join("s_test_name as b on a.subject = ...
- HDU 1875 畅通project再续 (最小生成树 水)
Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其它的小岛时都要通过划小船来实现. 如今政府决定大力发展百岛 ...
- MFC中几个函数的使用
1.GetDlgItem() CWnd* GetDlgItem ( int nID ) const;这个就足够了(在MFC中经常这么用),如果你是在win32API下面写的话,那么一般创建一个窗口 ...
- javascript回调函数,闭包作用域,call,apply函数解决this的作用域问题
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- SpringBoot学习之常用注解
@SpringBootAppliaction:通常注解写在SpringBoot启动类中,主要包括三个作用: 1.@Configuration表示将该类作用springboot配置文件类. 2.@Ena ...
- VueJS渐进式JS框架中文学习
官方网站:http://vuejs.org/ GitHub:https://github.com/vuejs/vue 中文学习地址:https://cn.vuejs.org/
- 高阶函数:map()/reduce()
Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clus ...