【求指教】浙大PAT 5-07. 新浪微博热门话题(30)

都没有 2015-01-06 03:05:50
这个是题目的地址:http://www.patest.cn/contests/ds/5-07
以下是我的代码,在第四个测试数据下总是答案错误。
这道题我已经搁置了两个星期了还是一样的错误
各路高手麻烦看下我的代码
思路就是用get_hot函数获得一条热门话题,再用哈希插入到数组中,产生冲突的地方用链表处理。
插入后返回插入数据的地址,如果这个数据出现的次数比当前最大的数据还要大,更新最大值和ans。如果这个数据出现的次数和当前最大值相等,比较这个数据和ans的字母序,更新ans。
用exist函数检测同一条微博是否出现两条相同的话题。

我觉得问题出在get_hot函数里面。
可能我的理解和题意不一样。
请指教
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct hash Hash;
struct hash
{
char HOT[150];
Hash *next;
int *sum;
}H[100003];
Hash * creat()
{
Hash *p;
p=(Hash*)malloc(sizeof(Hash));
p->sum=NULL;
p->next=NULL;
return p;
}
int getkey(char ID[])
{
unsigned int key=0,i=0;
while(ID[i])
{
key = key<<5;
key+=ID[i];
key%=100003;
i++;
}
return key%100003;
}
Hash * insert(char HOT[])
{
int key=getkey(HOT);
if(H[key].sum==NULL)
{
strcpy(H[key].HOT,HOT);
H[key].sum=(int*)malloc(sizeof(int));
*(H[key].sum)=1;
H[key].next=NULL;
return &H[key];
}
else
{
Hash *p,*q;
q=p=&H[key];
while(p)
{
if(strcmp(p->HOT,HOT)==0)
{
(*(p->sum))++;
return p;
}
q=p;
p=p->next;
}
p=q->next=creat();
strcpy(p->HOT,HOT);
p->sum=(int*)malloc(sizeof(int));
*(p->sum)=1;
return p;
}
}
bool get_hot(char HOT[],char t[],int *i)
{
int k=0,len=0;
while(t[*i])
{
if(t[*i]=='#')
{
(*i)++;
while(t[*i]!='#' && t[*i] && len<40)
{
if( ('A'<=t[*i] && t[*i]<='Z') || ('a'<=t[*i] && t[*i]<='z') || ('0'<=t[*i] && t[*i]<='9'))
{
if('A'<=t[*i] && t[*i]<='Z')
t[*i]+='a'-'A';
HOT[k++]=t[*i];
}
else if(k && HOT[k-1]!=' ')
HOT[k++]=' ';
(*i)++;
len++;
}
if(k && HOT[k-1]==' ')
k--;
HOT[k]='\0';
if(HOT[0]<='z' && HOT[0]>='a')
HOT[0]+='A'-'a';

if(len>=40)
while(t[*i]!='#')
(*i)++;

(*i)++;
return true;
}
else
(*i)++;
}
return false;
}
bool exist(char HOT[],char table[40][45],int *k)
{
int i=0;
for(i=0;i<*k;i++)
{
if(strcmp(HOT,table[i])==0)
return true;
}
strcpy(table[*k],HOT);
(*k)++;
return false;
}
int main()
{
int n,more=0,i,max=0,k=0;
char HOT[150];
char t[150];
char table[140][45];
Hash *p,*ans;
for(n=0;n<100003;n++)
H[n].sum=NULL;
scanf("%d",&n);
getchar();
while(n--)
{
gets(t);
i=0;
k=0;
while(get_hot(HOT,t,&i))
{
if(exist(HOT,table,&k))
continue;
p=insert(HOT);
if(*(p->sum) > max)
{
max=*(p->sum);
ans=p;
more=0;
}
else if(*(p->sum) == max)
{
if(strcmp(p->HOT,ans->HOT)<0)
ans=p;
more++;
}
}
}
printf("%s\n%d\n",ans->HOT,max);
if(more)
printf("And %d more ...\n",more);
return 0;
}
...全文
132 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧