java toHalf_MoreThanHalfInArray.java
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相关推荐
- java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)
具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...
- 介绍java -cp java -jar的区别
java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...
- 【Java】Java连接Mysql数据库的demo示例
[Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...
- java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文
[Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...
- Java 异常java.lang.IllegalArgumentException: Illegal group reference
Java 异常java.lang.IllegalArgumentException: Illegal group reference 参考文章: (1)Java 异常java.lang.Illegal ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
- 做了6年的Java,java视频教程传智播客
JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...
最新文章
- fdisk -l 找不到分区怎么办?想办法找到隐藏分区。
- Pycharm 创建 Django admin 用户名和密码
- html偷拍代码,一段植入木马的html代码
- ITK:创建一个图像区域
- Linux基础优化方法(四)———远程连接缓慢优化
- qr码是二维码码_如何使用QR码进行有效的营销和推广
- vs2013和vs2010的配置
- 论文浅尝 - ACL2021 | 探讨跨句事件联合抽取问题
- 字体图标使用教程 阿里字体图标iconfont 鲸鱼编程
- 【剑指offer】二叉搜索树转双向链表,C++实现
- Netty 服务 接收新数据
- 优秀linux系统设计,Linux系统下设计优秀实用程序的艺术
- 借助模糊测试 深耕细作你的压力测试
- Windows10下安装MySQL8.0
- python概念-各类绑定的概念和property的变态一面
- python累乘累加_Python3 实现列表元素求累和,求累乘
- CentOS7里ping命令详解
- 今天, IG 帮我们圆梦
- php冰蝎一句话,利用动态二进制加密实现新型一句话木马之PHP篇(转)冰蝎
- 基于STM32开发可燃气体智慧检测系统
热门文章
- java线程暂停_Java之线程停止
- C语言学习之打印菱形
- quartz 表说明
- springboot中端点监管 endpoint actuator
- Redis使用场景一,查询出的数据保存到Redis中,下次查询的时候直接从Redis中拿到数据。不用和数据库进行交互。...
- 深入剖析C++多态、VPTR指针、虚函数表
- 使用wlan接收器经常重新登录怎么办
- swoole+redis(websocket聊天室demo)
- 二叉查找树BST----java实现
- [转]正确配置Linux系统ulimit值的方法