题目

在数组中找到出现次数大于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. 【2048小游戏】——原生js爬坑之封装行的移动算法&事件

    引言:2048小游戏的核心玩法是移动行,包括横行和纵行,玩家可以选择4个方向,然后所有行内的数字就会随着行的移动而向特定的方向移动.这个行的移动是一个需要重复调用的算法,所以这里就要将一行的移动算法封 ...

  2. 19. Spring Boot 添加JSP支持【从零开始学Spring Boot】

    转:http://blog.csdn.net/linxingliang/article/details/52017140 这个部分比较复杂,所以单独创建一个工程来进行讲解: 大体步骤: (1)     ...

  3. Solidworks如何改变零件颜色

    如图所示装配体有三个零件,现在我想把移动件的颜色变成红色   鼠标左键单击要改变颜色的零件(这里点击"移动件"),然后在弹出的菜单中选择颜色,最后点击"编辑颜色" ...

  4. PHP中读取文件的几个方法

    整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件 ...

  5. tcpdump命令使用详解

    阅读(226) 一:命令介绍: tcpdump,用简单的语言概括就是dump the traffic on a network,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获 ...

  6. ionic 调试 "死亡白屏"

    死亡白屏(White Screen of Death) 我想“死亡白屏”应该是不需要解释的,开发过ionic app的童鞋应该都有遇到过,这里解释以防读者没有听说过:“可能在浏览器中调试时一切正常,当 ...

  7. C# 读取Excel中的数据

    #region 读取Excel中的数据 /// <summary> /// 读取Excel中的数据 /// </summary> /// <param name=&quo ...

  8. Archlinux休眠设置

    2017-03-11 更新: 优化部分文字描述; 默认情况下禁用 swap 分区, 当执行休眠操作时先启用 swap 分区, 然后再执行休眠操作(给 /usr/bin/{swapon,swapoff} ...

  9. openssl之BIO系列之22---Cipher类型的BIO

    Cipher类型BIO ---依据openssl doc\crypto\bio_f_cipher.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net , ...

  10. 在Ubuntu 14.04 64bit中永久添加DNS的方法

    DNS信息是由/etc/resolv.conf提供的,它是每次开机时,由/sbin/resolvconf生成的/etc/resolv.conf是/run/resolvconf/resolv.conf的 ...