Java编程题: 数组中出现次数超过一半的数字
发布日期:2021-05-08 06:39:02 浏览次数:32 分类:精选文章

本文共 1324 字,大约阅读时间需要 4 分钟。

数组中出现次数超过一半的数字

在一个数组中找出出现次数超过一半的数字,如果不存在这样的数字,则返回0。这个问题可以通过两种方法高效地解决。

方法一:排序法

  • 思路:将数组排序后,中间的那个数字即为出现次数超过一半的数字。因为如果有一个数字出现次数超过一半,那么排序后它会集中在中间位置。
  • 步骤
    • 对数组进行排序。
    • 找到中间的那个数字。
  • 优点:代码简单直接。
  • 缺点:可能需要处理多个超过一半的数字或刚好等于一半的情况。
  • 方法二:阵地攻守法

  • 思路:从第一个数字开始作为第一个士兵,遇到相同的数字增加士兵数量,遇到不同的数字减少士兵数量。当士兵数量为0时,以当前数字作为新的士兵继续。最终剩下的士兵即为可能的主元素,再次确认其出现次数是否超过一半。
  • 步骤
    • 初始化第一个数字为士兵,数量为1。
    • 遍历数组,遇到相同数字加1,遇到不同数字减1,士兵数量为0时更新士兵为当前数字,数量为1。
    • 再次遍历确认士兵的出现次数是否超过一半。
  • 优点:时间复杂度为O(n),处理多个超过一半或刚好等于一半的情况。
  • 缺点:代码稍复杂。
  • 实现代码

    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;
    }
    }

    代码解释

  • 初始化:检查数组长度,如果为空返回0。将第一个数字设为初始士兵,数量为1。
  • 第一次遍历:遇到相同数字增加士兵数量,遇到不同数字减少。士兵数量为0时,更新士兵为当前数字,数量为1。
  • 第二次遍历:统计士兵的出现次数,确认是否超过一半。如果超过,返回士兵;否则返回0。
  • 这种方法确保了在合理时间内准确找出出现次数超过一半的数字,适用于各种情况。

    上一篇:Java编程题:简单错误记录(LinkedHashMap)
    下一篇:Java编程题:查找兄弟单词(Collections.sort)

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月16日 05时52分46秒