数据结构:哈希表

来源:互联网 发布:淘宝分销平台能挣钱吗 编辑:程序博客网 时间:2024/06/17 03:05

Problem Description

 在n个数中,找出出现次数最多那个数字,并且输出出现的次数。如果有多个结果,输出数字最小的那一个。

Input

 单组数据,第一行数字n(1<=n<=100000)。
接下来有n个数字,每个数字不超过100000000

Output

 出现次数最多的数字和次数。

Example Input

31 1 2

Example Output

1 2

Hint

 

Author

 cz

AC代码

#include <bits/stdc++.h>using namespace std;#define N 100struct node{    int data;    struct node *next;};struct node *a[1000000];void Insert(long long n){    long long int x=n/N;//取整储存    struct node *p=new node;    p->data=n;    p->next=a[x];//类似逆序建立链表    a[x]=p;}int Find(long long n)//求每个元素的出现次数{    int cnt=0;    long long x=n/N;//取整查找    //while(a[x]!=NULL),这样写会进入死循环;因为如果某条链式内部有元素,那么就一定会有元素    if(a[x]!=NULL)//链式储存,每条链不空    {        struct node *p;        p=a[x];        while(p!=NULL)//链不空,继续查找        {            if(p->data==n)            {                cnt++;            }            p=p->next;        }    }    return cnt;}int v[1000005];int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&v[i]);        Insert(v[i]);    }    int maxn=-1;    int x;    for(int i=0;i<n;i++)    {        if(Find(v[i])>maxn||(Find(v[i])==maxn&&v[i]<x))//判断条件数字小且次数多        {            maxn=Find(v[i]);            x=v[i];        }    }    printf("%d %d\n",x,maxn);}


这里要思考几个问题,就是为什么N 取100,而且数组开的是10^6,却不取别的,为什么x=n/N 而不是%???
读者可以思考一下