有序数组中出现次数超过25%的元素

给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。

我认为这题不是很难,大家应该都有自己的想法,不过应该有不少人虽然有着想法但无法将它实现吧,我先来说说我的想法。

首先我们能从中了解到,它是一个有序数组,所以它们之间相同的元素应该紧挨在一起,这就省了我们将它变成有序的步骤。我们先设一个变量flag=1;这是元素的个数,因为至少都有一个,所以我们将它初始化为1,当它和它的后一个相同时就让它加一,如果不同则让flag=1,然后比较flag是否大于元素个数/4;依次循环下去,直到找到该元素为止。下面是代码:

int findSpecialInteger(int* arr, int arrSize) {

    if (arrSize < 4)//当元素个数小于4时,那么它们所有的元素都相同,因为如果不同则于题目恰好有一个整数,它的出现次数超过数组元素总数的 25%。

    {

        return arr[0];

    }

    int i = 0;

    int flag = 1;

    for (i = 0; i < arrSize - 1; i++)//arrSize-1是为了于后面的一个元素比较而不至于数组越界。

    {

        if (arr[i] == arr[i + 1])

        {

            flag++;//记录相同元素的个数。

        }

        else

        {

            flag = 1;

        }

        if (flag > arrSize / 4)//为什么不放在else里面:为了防止其元素在最后,以至于还没比较就直接结束循环。

        {

            return arr[i];

        }

    }

    return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值