进阶实验5-3.2 新浪微博热门话题 (30分)-字符串处理
解题思路:总感觉题意不清晰,前前后后折腾无数次均无法AC,,后在网上陆续参考其他大神的文章才得以AC
题意理解:
1、一条微博中重复提到的话题只算1次
2、And k more ...其中的K是指如果被提到最多的话题不唯一,则k=相同话题条数-1
3、话题格式化处理:所有字母转换成小写字母,除数字和字母外,其它字符换成空格,多个空格只保留一个空格,话题首尾不能有空格
4、话题输出首字母大写
#include <stdio.h> #include <string.h> #define Max 1000000 #define MaxLen 200 typedef struct { char s[MaxLen]; int all; int cnt; int flag; } Topic; Topic f[Max]; int t=0; int IsChar(char c) { if((c>='0'&&c<='9')||(c>='a'&&c<='z')||(c>='A'&&c<='Z')) return 1; return 0; } void GetTopic(char s[],int tag) { int i=0,flag=0,j=0,cnt=0,k; char c[MaxLen]; while(s[i]!='\0') { if(s[i]=='#'&&!flag) { flag=1; i++; } if(flag) { if(IsChar(s[i])) { if(!j) { if(s[i]>='a'&&s[i]<='z') s[i]=s[i]-'a'+'A'; } else { if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]-'A'+'a'; } c[j++]=s[i]; cnt=0; } else { if(s[i]!='#') { s[i]=' '; if(!cnt) { if(s[i-1]!='#'&&s[i+1]!='#') c[j++]=s[i]; cnt++; } } else { flag=0; c[j]='\0'; for(k=0; k<t; k++) { if(!strcmp(f[k].s,c)) { f[k].all++; if(f[k].flag!=tag) { f[k].cnt++; f[k].flag=tag; } break; } } if(k==t) { strcpy(f[t].s,c); f[t].all=1; f[t].cnt=1; f[t].flag=tag; t++; } j=0; } } } i++; } } char MIN[MaxLen]; int count; int Find() { int i,max=0,pos=0; for(i=0; i<t; i++) { if(f[i].cnt>max) { max=f[i].all; strcpy(MIN,f[i].s); pos=i; count=1; } else if(f[i].cnt==max) { count++; if(strcmp(f[i].s,MIN)<0) { strcpy(MIN,f[i].s); pos=i; } } } return pos; } int main() { char s[MaxLen]; int n,i; scanf("%d",&n); getchar(); for(i=0; i<n; i++) { gets(s); GetTopic(s,i); } int pos=Find(); printf("%s\n",MIN); printf("%d\n",f[pos].cnt); if(count-1>0) printf("And %d more ...",count-1); return 0; }
勤能补拙,熟能生巧