出错原因: 这个题寒假的时候做过,当时用的线性探测再散列处理的冲突,这次用链表做,花了好长时间老是WA,原因是出在了没有注意细节上,题目上要求的多个结果时输出最小的注意到。
***************************************************我是华丽的分割线************************************************************
数据结构实验:哈希表
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
输入
接下来有n个数字,每个数字不超过100000000
输出
示例输入
3 1 1 2
示例输出
1 2
代码(链表):#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
int cs;
int zf;
struct node*next;
}*H[100005],*p,*q;
int main()
{
int a,n,m,i,zf,qy,bs,flag;
scanf("%d",&n);
for(i=0;i<n;i++)
{
zf=1;
scanf("%d",&a);
if(a<0)//可能出现负数
{
zf=-1;
}
a=a*zf;
qy=a%100000;
bs=a/100000;
if(H[qy]==NULL)
{
H[qy]=(struct node *)malloc(sizeof(struct node));
H[qy]->next=NULL;
}
p=H[qy];
if(H[qy]->next!=NULL)
{
p=p->next;
if(p->data==bs && p->zf==zf)
p->cs++;
}
if(p->data!=bs || p->zf!=zf)
{
while(p->next!=NULL)
{
p=p->next;
}
q=(struct node *)malloc(sizeof(struct node));
q->data=bs;
q->zf=zf;
q->cs=1;
q->next=NULL;
p->next=q;
p=q;
}
}
int max[2]={0};
for(i=0;i<100005;i++)
{
if(H[i]!=NULL)
{
p=H[i];
while(p->next!=NULL)
{
p=p->next;
if(p->cs>max[0])
{
max[0]=p->cs;
max[1]=(p->data*100000+i)*(p->zf);
}
if(p->cs==max[0])
{
if(max[1]>(p->data*100000+i)*(p->zf))
max[1]=(p->data*100000+i)*(p->zf);
}
}
}
}
printf("%d %d",max[1],max[0]);
return 0;
}
***************************************************我要分割!!!!!*****************************************************************
代码(普通哈希):
#include<stdio.h> int k[110002][4]={0}; int main() { int a,b,d,e,bj,zf; int c; int max [4]={-1}; scanf("%d",&a); for(b=0;b<a;b++) { zf=1; scanf("%d",&c); if(c<0) { zf=-1; c=c*zf; } d=c%100000; bj=d; e=c/100000; while(k[d][0]!=0 && (e!=k[d][1] || zf!=k[d][3])) d++; k[d][0]++; k[d][1]=e; k[d][2]=bj; k[d][3]=zf; if(k[d][0]>max[0]) { max[0]=k[d][0]; max[1]=k[d][1]; max[2]=k[d][2]; max[3]=k[d][3]; } } printf("%d %d",(max[1]*100000+max[2])*max[3],max[0]); return 0; }