找出整形数组中占比超过一半的数

42 阅读2分钟

找出整形数组中占比超过一半的数的问题描述 小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1: 输入:array = [1, 3, 8, 2, 3, 1, 3, 3, 3] 输出:3 样例2: 输入:array = [5, 5, 5, 1, 2, 5, 5] 输出:5 样例3: 输入:array = [9, 9, 9, 9, 8, 9, 8, 8] 输出:9

完整代码

public class Main {
    public static int solution(int[] array) {
        int candidate = 0;  // 初始化候选元素
        int count = 0;      // 初始化计数器
        
        // 遍历数组
        for (int num : array) {
            // 如果计数器为0,更新候选元素
            if (count == 0) {
                candidate = num;
                count = 1;
            } 
            // 如果当前元素与候选元素相同,计数器加1
            else if (num == candidate) {
                count++;
            } 
            // 如果当前元素与候选元素不同,计数器减1
            else {
                count--;
            }
        }
        
        // 返回候选元素
        return candidate;
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3);
    }
}

代码解释

  1. 类和方法定义

    • public class Main:定义了一个公共类 Main
    • public static int solution(int[] array):定义了一个公共静态方法 solution,接受一个整数数组 array 作为参数,并返回一个整数。
  2. 变量初始化

    • int candidate = 0;:初始化一个变量 candidate,用于存储当前的候选元素。初始值为0。
    • int count = 0;:初始化一个变量 count,用于记录候选元素的出现次数。初始值为0。
  3. 遍历数组

    • for (int num : array):使用增强型 for 循环遍历数组 array 中的每一个元素,将其赋值给变量 num
  4. 更新候选元素和计数器

    • if (count == 0):如果 count 为0,表示当前没有候选元素,或者之前的候选元素已经被抵消。
      • candidate = num;:将当前元素 num 设为候选元素。
      • count = 1;:将计数器 count 设为1。
    • else if (num == candidate):如果当前元素 num 与候选元素 candidate 相同。
      • count++;:将计数器 count 加1。
    • else:如果当前元素 num 与候选元素 candidate 不同。
      • count--;:将计数器 count 减1。
  5. 返回结果

    • return candidate;:遍历结束后,candidate 就是我们要找的多数元素,将其返回。
  6. 主方法

    • public static void main(String[] args):定义了程序的入口点 main 方法。
    • System.out.println(solution(new int[]{1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3);:调用 solution 方法,并传入一个测试用例 [1, 3, 8, 2, 3, 1, 3, 3, 3],预期输出为 3。然后打印结果。

测试用例

  • main 方法中,我们使用了一个测试用例 [1, 3, 8, 2, 3, 1, 3, 3, 3],预期输出为 3

总结

  • 该算法通过遍历数组,利用计数器 count 和候选元素 candidate 来找到出现次数超过数组长度一半的元素。
  • 最终返回的 candidate 就是我们要找的多数元素。