package pointer_to_offer;

import java.util.Random;

/**

* 面试题29:查找数组中出现次数超过一半的数字

* 1. 使用快速排序中的partition方法 和 递归

* 2. 根据题目逻辑,将出现的次数和结果保存起来,由于目标出现次数超过数组的一半,所以遍历结束后结果就是目标

*/

public class MoreThanHalfInArray {

private static Random rand = new Random(47);

public static int findByPartition(int[] data) {

if (data == null) return -1;

int length = data.length;

int middle = length >> 1;

int start = 0;

int end = length - 1;

int index = partition(data, start, end);

while (index != middle) {

if (index > middle) {

end = index - 1;

} else {

start = index + 1;

}

index = partition(data, start, end);

}

int result = data[middle];

//有必要的话再检查一下,这个数字是否真的占据了一半以上(针对非法的输入)

return result;

}

private static int partition(int[] data, int start, int end) {

int index = start + rand.nextInt(end - start);

swap(data, end, index);

int smallPos = start - 1;

for (index = start; index < end; index++) {

if (data[index] < data[end]) {

smallPos++;

swap(data, index, smallPos);

}

}

smallPos++;

swap(data, end, smallPos);

return smallPos;

}

private static void swap(int[] data, int pos1, int pos2) {

if (pos1 == pos2) return;

int temp = data[pos1];

data[pos1] = data[pos2];

data[pos2] = temp;

}

private static int findByLogic(int[] data) {

if (data == null) return -1;

int result = data[0];

int times = 1;

for (int i = 0; i < data.length; i++) {

if (times == 0) {

result = data[i];

times = 1;

} else {

if (result == data[i]) {

times++;

} else {

times--;

}

}

}

return result;

}

public static void main(String[] args) {

int[] data = {1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 3, 5, 1};

System.out.println(findByPartition(data));

System.out.println(findByLogic(data));

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

java toHalf_MoreThanHalfInArray.java相关推荐

  1. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)

    具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...

  2. 介绍java -cp java -jar的区别

    java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...

  3. 【Java】Java连接Mysql数据库的demo示例

    [Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...

  4. java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文

    [Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...

  5. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...

  6. Java 异常java.lang.IllegalArgumentException: Illegal group reference

    Java 异常java.lang.IllegalArgumentException: Illegal group reference 参考文章: (1)Java 异常java.lang.Illegal ...

  7. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  8. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  9. 做了6年的Java,java视频教程传智播客

    JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...

最新文章

  1. fdisk -l 找不到分区怎么办?想办法找到隐藏分区。
  2. Pycharm 创建 Django admin 用户名和密码
  3. html偷拍代码,一段植入木马的html代码
  4. ITK:创建一个图像区域
  5. Linux基础优化方法(四)———远程连接缓慢优化
  6. qr码是二维码码_如何使用QR码进行有效的营销和推广
  7. vs2013和vs2010的配置
  8. 论文浅尝 - ACL2021 | 探讨跨句事件联合抽取问题
  9. 字体图标使用教程 阿里字体图标iconfont 鲸鱼编程
  10. 【剑指offer】二叉搜索树转双向链表,C++实现
  11. Netty 服务 接收新数据
  12. 优秀linux系统设计,Linux系统下设计优秀实用程序的艺术
  13. 借助模糊测试 深耕细作你的压力测试
  14. Windows10下安装MySQL8.0
  15. python概念-各类绑定的概念和property的变态一面
  16. python累乘累加_Python3 实现列表元素求累和,求累乘
  17. CentOS7里ping命令详解
  18. 今天, IG 帮我们圆梦
  19. php冰蝎一句话,利用动态二进制加密实现新型一句话木马之PHP篇(转)冰蝎
  20. 基于STM32开发可燃气体智慧检测系统

热门文章

  1. java线程暂停_Java之线程停止
  2. C语言学习之打印菱形
  3. quartz 表说明
  4. springboot中端点监管 endpoint actuator
  5. Redis使用场景一,查询出的数据保存到Redis中,下次查询的时候直接从Redis中拿到数据。不用和数据库进行交互。...
  6. 深入剖析C++多态、VPTR指针、虚函数表
  7. 使用wlan接收器经常重新登录怎么办
  8. swoole+redis(websocket聊天室demo)
  9. 二叉查找树BST----java实现
  10. [转]正确配置Linux系统ulimit值的方法