出现次数超过一半的数

描述

给出一个含有n(0 < n <= 1000)个整数的数组,请找出其中出现次数超过一半的数。

数组中的数大于-50且小于50。

输入

第一行包含一个整数n,表示数组大小;
第二行包含n个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。

输出

如果存在这样的数,输出这个数;否则输出no。

样例输入

3
1 2 2

样例输出

2
#include <iostream>
#include <cmath>
int i,j;
#define A 1000+5
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[A];
    a[n]=51;         //  '1'
    for(i=0;i<n;i++)
    {
        cin>>a[i];
        }
    for(i=1;i<n;i++)
    {
        for(j=0;j<n-i;j++)
        {
            int temp;
            if(a[j]>a[j+1])
            {
                temp=a[j+1];
                a[j+1]=a[j];
                a[j]=temp;
                }
            }
        }
    int count=1;
    for(i=0;i<=n;i++)        //  '2'
    {
        if(a[i]==a[i+1])count++;
        else
        {
            if(count>n/2)
            {
                cout<<a[i]<<endl;
                return 0;
                }
            else
            {
                count=1;
                }
            }
        }
    cout<<"no"<<endl;
    return 0;
    }

关于对  ‘1’ 和 ‘2’中 'i=n' 的解释:例如题干上    样例输出   所示

若少了 ‘1’ ‘2’则会出现 ‘no’ 的答案,因为对1  2  2中最后一个 2 不会进行 if 判断,所以也就不会进入相应的 else 判断

对于本题更建议用桶排,不用考虑这些细节,但要解决负数的问题,好吧,(我太懒了,不狡辩)

以下   桶排

#include <iostream>
#include <stdio.h>
#include <cstring>
#define A 1000+5

using namespace std;

int i,j;

int main()
{
    int n;
    cin>>n;

    int a[A]={0},t;
    for(i=0;i<n;i++)
    {
        cin>>t;
        a[t+50]++;
    }

    int temp;

    for(i=0;i<=100;i++)
    {
        if(a[i]>n/2)
        {
            temp=i-50;
            cout<<temp;
            return 0;
        }
    }

    cout<<"no";

    return 0;
}
发布了113 篇原创文章 · 获赞 2 · 访问量 1542

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/103872342
今日推荐