剑指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");
	}
}
相关推荐
Yeats_Liao7 分钟前
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
java·后端·架构
通信仿真爱好者11 分钟前
第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
算法·matlab·mimo·信号检测
范什么特西17 分钟前
网络代理问题
java·linux·服务器
KaifuZeng19 分钟前
通信与接口协议面试十、PCIe
单片机·嵌入式硬件·面试·通信与接口协议
AI科技星27 分钟前
全域谱分析:无穷维超复数信息场分形统一场论——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·python·算法·金融·乖乖数学·全域数学
三月不知肉味y29 分钟前
2026-07-05-JAVA面试场景题训练
java·开发语言·面试
utf8mb4安全女神1 小时前
【Redis数据库】哨兵集群/redis集群/安装配置/主从复制/数据持久化操作/数据结构/安全限制/PHP redis/
linux·服务器·数据结构·数据库·redis·缓存
豆瓣鸡1 小时前
封装 API 请求日志切面——从注解定义到 Starter 自动装配
java·开发语言·spring boot
先吃饱再说1 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
掉鱼的猫2 小时前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·llm·agent