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

67 阅读4分钟

问题描述

班上有一位同学从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助班上的这位同学来找到这个数字。


测试样例

样例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

解题思路

  1. 初始化:我们需要两个变量,一个用于存储当前候选的数字(candidate),另一个用于存储该数字的计数(count)。

  2. 遍历数组:对于数组中的每一个数字:

    • 如果count为0,将当前数字设为candidate,并将count设为1。
    • 如果当前数字与candidate相同,增加count
    • 如果当前数字与candidate不同,减少count
  3. 验证:遍历结束后,candidate就是可能的答案。我们需要再次遍历数组,确认candidate的出现次数是否确实超过一半。

代码提示

你可以根据上述思路,在solution方法中实现这个算法。以下是一些代码提示:

java

public class Main {

    public static int 

    solution(int[] 

    array) {

        // 初始化候选数

        字和计数

        int candidate 

        = 0;

        int count = 0;

        // 遍历数组,找

        出候选数字

        for (int num 

        : array) {

            if (count 

            == 0) {

                // 如

                果计数

                为0,更

                新候选

                数字

                candid

                ate = 

                num;

                count 

                = 1;

            } else if 

            (num == 

            candidate)

             {

                // 如

                果当前

                数字与

                候选数

                字相

                同,增

                加计数

                count

                ++;

            } else {

                // 如

                果当前

                数字与

                候选数

                字不

                同,减

                少计数

                count-

                -;

            }

        }

        // 验证候选数字

        的出现次数是否超

        过一半

        count = 0;

        for (int num 

        : array) {

            if (num 

            == 

            candidate)

             {

                count

                ++;

            }

        }

        // 如果候选数字

        的出现次数超过一

        半,返回候选数字

        if (count > 

        array.

        length / 2) {

            return 

            candidate;

        } else {

            // 如果没有

            数字出现次数

            超过一半,返

            回-1或其他

            错误码

            return -1;

        }

    }

    public static 

    void main(String

    [] args) {

        // 添加你的测试

        用例

        System.out.

        println

        (solution(new 

        int[]{1, 3, 

        8, 2, 3, 1, 

        3, 3, 3}) == 

        3);

    }

}

关键步骤

  1. 初始化候选数字和计数int candidate = 0; int count = 0;
  2. 遍历数组,找出候选数字:根据count的变化更新candidate
  3. 验证候选数字的出现次数:再次遍历数组,确认candidate的出现次数是否超过一半。

解题思路

  1. 初始化:我们需要两个变量,一个用于存储当前候选的数字(candidate),另一个用于存储该数字的计数(count)。

  2. 遍历数组:对于数组中的每一个数字:

    • 如果count为0,将当前数字设为candidate,并将count设为1。
    • 如果当前数字与candidate相同,增加count
    • 如果当前数字与candidate不同,减少count
  3. 验证:遍历结束后,candidate就是可能的答案。我们需要再次遍历数组,确认candidate的出现次数是否确实超过一半。

代码提示

你可以根据上述思路,在solution方法中实现这个算法。以下是一些代码提示:

java

public class Main {

    public static int 

    solution(int[] 

    array) {

        // 初始化候选数

        字和计数

        int candidate 

        = 0;

        int count = 0;

        // 遍历数组,找

        出候选数字

        for (int num 

        : array) {

            if (count 

            == 0) {

                // 如

                果计数

                为0,更

                新候选

                数字

                candid

                ate = 

                num;

                count 

                = 1;

            } else if 

            (num == 

            candidate)

             {

                // 如

                果当前

                数字与

                候选数

                字相

                同,增

                加计数

                count

                ++;

            } else {

                // 如

                果当前

                数字与

                候选数

                字不

                同,减

                少计数

                count-

                -;

            }

        }

        // 验证候选数字

        的出现次数是否超

        过一半

        count = 0;

        for (int num 

        : array) {

            if (num 

            == 

            candidate)

             {

                count

                ++;

            }

        }

        // 如果候选数字

        的出现次数超过一

        半,返回候选数字

        if (count > 

        array.

        length / 2) {

            return 

            candidate;

        } else {

            // 如果没有

            数字出现次数

            超过一半,返

            回-1或其他

            错误码

            return -1;

        }

    }

    public static 

    void main(String

    [] args) {

        // 添加你的测试

        用例

        System.out.

        println

        (solution(new 

        int[]{1, 3, 

        8, 2, 3, 1, 

        3, 3, 3}) == 

        3);

    }

}

关键步骤

  1. 初始化候选数字和计数int candidate = 0; int count = 0;
  2. 遍历数组,找出候选数字:根据count的变化更新candidate
  3. 验证候选数字的出现次数:再次遍历数组,确认candidate的出现次数是否超过一半。