剑指Offer(牛客版)--面试题39: 数组中出现的次数超过一半的数字

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

分析:

1、分析判断输入数组的合法性;

2、寻找出现次数超过数组长度一半的数字;

3、检查寻找的数字是否超过数组长度的一半;

完整代码:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        //检查输入的合法性
        if(numbers.empty())
            return 0;
        /*******寻找超过数组长度一半的数字*******/
        //获取容器的大小
        int length = numbers.size();
        //获取比较的数字
        int result = numbers[0];
        //数字出现的次数
        int times = 1;
        //遍历容器里的元素
        for (int i = 1; i < length - 1; ++i)
        {
            //判断当前的数字是否为0
            if(times == 0)
            {
                //重新设置比较的数字
                result = numbers[i];
                //重置次数为1
                times = 1;
            }
            //如果不为 0 的话,则比较下一个元素与比较元素是否相等
            else if(numbers[i] == result)
                //次数+1
                times++;
            else
                //次数-1
                times--;
        }
        //确认寻找到的数字是否为数组长度的一半
        if(!CheckMoreThanHalf(numbers, length, result))
            return 0;
        //返回最终的结果
        return result;
    }
private:
    bool CheckMoreThanHalf(vector<int> &numbers, int length, int result)
    {
        //声明一个变量,用来表示次数并初始化为0
        int times = 0;
        //遍历容器里的元素
        for(int i = 0; i < length; ++i)
        {
            //计算result在容器中出现的次数
            if(result == numbers[i])
                times++;
        }
        //声明一个布尔类型的变量,用来做标志
        bool MoreThanHalf = false;
        //判断result是否大于数组长度一半
        if(times * 2 > length)
            MoreThanHalf = true;
            
        return MoreThanHalf;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41923658/article/details/93476369