剑指offer面试题29 数组中出现次数超过一半的数字

考察点

java 复制代码
数组

知识点

题目

分析

本题目要求数组中出现次数超过一半的数字,其实是需要有一点数学思维,遍历数组,假设第一个元素就是超过一半的元素,并且记录元素出现的次数times,当遇到跟他一样的元素的时候times++,不一样的时候times--,直到times=0的时候可以暂时说明这个元素出现的次数肯定不是超过一半的,超过一半的元素最终times一定是大于0的那个

java 复制代码
public class TwentyNine {
	public static void main(String[] args) {
		int[] arr = {1,2,3,2,2,2,5,4,2};
		try {
			System.out.println(findMHalf(arr));
		} catch (Error e) {
			System.out.println(e);
		}
		int[] brr = {1,2,3,2,2,5,5,4};
		try {
			System.out.println(findMHalf(brr));
		} catch (Error e) {
			System.out.println(e);
		}
	}
	public static int findMHalf(int[] arr) {
		if (arr == null||arr.length <= 0) {
			throw new Error("input error");
		}
		int result = arr[0];
		int times = 1;
		for (int i = 1;i<arr.length;i++) {
			if (result == arr[i]) {
				times++;
			} else if(times > 0) {
				times--;
			} else {
				result = arr[i];
				times = 1;
			}
		}
		int count = 0;
		for (int i = 0;i<arr.length;i++) {
			if(result == arr[i]) {
				count++;
			}
		}
		if (count > arr.length/2) {
			return result;
		}
		throw new Error("input error");
	}
}
相关推荐
FakeOccupational32 分钟前
【数学 密码学】量子通信:光的偏振&极化的量子不确定性特性 + 量子密钥分发 BB84算法步骤
算法·密码学
呱牛do it1 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 3)
java·vue
ZhengEnCi2 小时前
S10-蓝桥杯 17822 乐乐的积木塔
算法
神の愛2 小时前
左连接查询数据 left join
java·服务器·前端
贾斯汀玛尔斯2 小时前
每天学一个算法--拓扑排序(Topological Sort)
算法·深度优先
大龄程序员狗哥3 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
exp_add33 小时前
质数相关知识
算法
南境十里·墨染春水3 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
雨奔3 小时前
Kubernetes 联邦 Deployment 指南:跨集群统一管理 Pod
java·容器·kubernetes
杨凯凡3 小时前
【021】反射与注解:Spring 里背后的影子
java·后端·spring