进阶实验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;
}

猜你喜欢

转载自www.cnblogs.com/snzhong/p/12582557.html