
Java编程题: 数组中出现次数超过一半的数字
思路:将数组排序后,中间的那个数字即为出现次数超过一半的数字。因为如果有一个数字出现次数超过一半,那么排序后它会集中在中间位置。 步骤: 优点:代码简单直接。 缺点:可能需要处理多个超过一半的数字或刚好等于一半的情况。 思路:从第一个数字开始作为第一个士兵,遇到相同的数字增加士兵数量,遇到不同的数字减少士兵数量。当士兵数量为0时,以当前数字作为新的士兵继续。最终剩下的士兵即为可能的主元素,再次确认其出现次数是否超过一半。 步骤: 优点:时间复杂度为O(n),处理多个超过一半或刚好等于一半的情况。 缺点:代码稍复杂。 初始化:检查数组长度,如果为空返回0。将第一个数字设为初始士兵,数量为1。 第一次遍历:遇到相同数字增加士兵数量,遇到不同数字减少。士兵数量为0时,更新士兵为当前数字,数量为1。 第二次遍历:统计士兵的出现次数,确认是否超过一半。如果超过,返回士兵;否则返回0。
发布日期:2021-05-08 06:39:02
浏览次数:32
分类:精选文章
本文共 1324 字,大约阅读时间需要 4 分钟。
数组中出现次数超过一半的数字
在一个数组中找出出现次数超过一半的数字,如果不存在这样的数字,则返回0。这个问题可以通过两种方法高效地解决。
方法一:排序法
- 对数组进行排序。
- 找到中间的那个数字。
方法二:阵地攻守法
- 初始化第一个数字为士兵,数量为1。
- 遍历数组,遇到相同数字加1,遇到不同数字减1,士兵数量为0时更新士兵为当前数字,数量为1。
- 再次遍历确认士兵的出现次数是否超过一半。
实现代码
public class Solution { public int MoreThanHalfNum_Solution(int[] numbers) { int n = numbers.length; if (n == 0) return 0; int num = numbers[0], count = 1; for (int i = 1; i < n; i++) { if (numbers[i] == num) { count++; } else { count--; } if (count == 0) { num = numbers[i]; count = 1; } } count = 0; for (int i = 0; i < n; i++) { if (numbers[i] == num) { count++; } } if (count * 2 > n) { return num; } return 0; }}
代码解释
这种方法确保了在合理时间内准确找出出现次数超过一半的数字,适用于各种情况。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月16日 05时52分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java.lang.IllegalStateException: Optional int parameter 'id' is not present but cannot be translated
2023-01-27
java农副产品购物app的设计与开发(ssm)
2023-01-27
JAVA分布式系统
2023-01-28
java分布式链路追踪;jvm应用监控-skywalking
2023-01-28
Java创建elasticsearch的model时,如何配置使用ik分词器?
2023-01-28
java加密解密
2023-01-28
Java反射
2023-01-28
java反射介绍
2023-01-28
Java反射代码编写
2023-01-28
JAVA反射机制
2023-01-28
JAVA反射机制
2023-01-28
Java反射获取private属性和方法(子类,父类,祖先....)
2023-01-28
Java反序列化-CC2分析,从零基础到精通,收藏这篇就够了!
2023-01-28
Java反序列化和JNDI注入漏洞案例实战
2023-01-28
JAVA反序列化漏洞修复解决方法
2023-01-28
java反编译工具--jd-gui
2023-01-28
java取整和java四舍五入方法
2023-01-28
Java可变参数列表
2023-01-28
Java各中依赖包介绍
2023-01-28
Java合同管理系统(源码+mysql+文档)
2023-01-28