sdut oj 1480 数据结构实验:哈希表

Description
在n个数中,找出出现次数最多那个数字,并且输出出现的次数。如果有多个结果,输出数字最小的那一个。Input 单组数据,第一行数字n(1<=n<=100000)。

接下来有n个数字,每个数字不超过100000000
Output 出现次数最多的数字和次数。
Sample
Input
3
1 1 2
Output
1 2
//如果是比较小的数可以直接用数组保存输入数据,比如输入一个1,就让a[1]加一,最后再判断最大数,但本题目数据太大,不能使用这种方法,这时候,哈希算法的优越性就展示出来了。
//哈希算法的目的就是可以让本无关系的数据保存在临近数组之间,这样保存数据的空间就变小了,而且方便我们再次查询。

 #include <stdio.h>
#include <string.h>
#include <math.h>
int a[100006],c[100006],x,y,i,j,z,m;//a数组中存的是数据,c数组中存的是个数。
int main()
{
    scanf("%d",&x);
    for(z=1;z<=x;z++)
    {
        scanf("%d",&y);
        m=y%x;//没必要一定用素数,因为只有x个,所以直接用x当除数。
        if(a[m]==0){//其实都是==,我不知道为啥这样在博客上不合法,请多包涵。
            a[m]=y;c[m]++;//如果该点没有走过,直接存储。
        }
        else{
        //这时候有两种情况,一种是这个数据之前出现过,当发现这一数据时可以直接在该c数组上加一,另一种情况是该数据的a【m】被别的数据占了,那就让本数据在m的基础上向前走,当走到x时,在从零开始,直到有一个a数据位置没有用过,就占住,并停止。
            while(1)
            {
                if(m==x)m=0;//当走到x时再接从零开始循环。
                if(a[m]==y){
                    c[m]++;break;
                }//找到组织。
                if(a[m]==0)
                {
                    a[m]=y;c[m]++;break;
                }//未找到组织,占领其他数据位置。
                m++;
            }
        }
        if((i<c[m])||(i==c[m]&&j>y)){
            i=c[m];j=y;
        }//i代表出现次数,j代表数据。
    }
    printf("%d %d\n",j,i);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值