如有不对,不吝赐教
这个题因为我看错了题目,结果多找了两天的bug,最后是对着别人的C++自己去找输出才找出来的……进入正题:
新浪微博可以在发言中嵌入“话题”,即将发言中的话题文字写在一对“#”之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还会随时更新热门话题列表,并将最热门的话题放在醒目的位置推荐大家关注。
本题目要求实现一个简化的热门话题推荐功能,从大量英文(因为中文分词处理比较麻烦)微博中解析出话题,找出被最多条微博提到的话题。
输入格式:
输入说明:输入首先给出一个正整数N(≤10^5),随后N行,每行给出一条英文微博,其长度不超过140个字符。任何包含在一对最近的#中的内容均被认为是一个话题,输入保证#成对出现。
输出格式:
第一行输出被最多条微博提到的话题,第二行输出其被提到的微博条数。如果这样的话题不唯一,则输出按字母序最小的话题,并在第三行输出And k more …,其中k是另外几条热门话题的条数。输入保证至少存在一条话题。
注意:两条话题被认为是相同的,如果在去掉所有非英文字母和数字的符号、并忽略大小写区别后,它们是相同的字符串;同时它们有完全相同的分词。输出时除首字母大写外,只保留小写英文字母和数字,并用一个空格分隔原文中的单词。
输入样例:
4
This is a #test of topic#.
Another #Test of topic.#
This is a #Hot# #Hot# topic
Another #hot!# #Hot# topic
输出样例:
Hot
2
And 1 more …
这个题目表达的有点问题,下面我按照我过了的案例解释一下格式以及里面的坑
1.k的意义:
其中k是另外几条热门话题的条数
这里的k是热门话题,就是次数相同的话题条数-1(减去的1是自己)
2.同一条的相同话题算一条话题:
第一行输出被最多条微博提到的话题,第二行输出其被提到的微博条数
计算的是被微博提到的条数
3.最后的表述问题:
两条话题被认为是相同的,如果在去掉所有非英文字母和数字的符号、并忽略大小写区别后,
它们是相同的字符串;同时它们有完全相同的分词。输出时除首字母大写外,只保留小写英文
字母和数字,并用一个空格分隔原文中的单词。
那么问题来了,按照它的表述,#topic#和#topi1c#算同一条,那么输出的时候到底是输出#topic#还是#topi1c#呢?
根据我通过的代码和别人的代码,这两个东西不能算作一个话题,这就解决了。
这个题目中,我是用树结构来存话题的,然后在每次加入话题的时候比对这句话中的其他话题(用链表比对),最后在遍历一遍树的到k more,然后注意的一点就是输入字符串的处理。自己检查时最好多试试带特殊字符的,有前导后缀空格、特殊字符的以及一个句子有相同话题的,还有出现次数相同的话题的选取,如果都过了,基本上就没啥问题了。
下面给代码:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct HotTopic{
char key[141]; //微博关键词
int count; //该关键词出现的次数
struct HotTopic *left,*right;
};
struct TopicList{
char key[141];
struct TopicList *next;
}; //用于在同一个微博中检验不同的话题
struct HotTopic *GetKey(struct HotTopic *root,char *weiBo,char *key);
struct HotTopic *InsertHT(struct HotTopic *root,char *key);
int InsertTL(struct TopicList **head,char *key);
void FreeHT(struct HotTopic *root);
void FreeTL(struct TopicList *head);
char hotKey[141]; //记录最火热关键词
int count=1; //最热门话题数记录出现的次数
int all=0; //记录热门话题总数
//这两个初始值定为1是因为总有一条话题
int main(void)
{
int N; //输入的微博
int i;
char weiBo[141];
char key[141];
struct HotTopic *root=(struct HotTopic *)malloc(sizeof(struct HotTopic));
root->left=root->right=NULL;
root->count=1;
root->key[0]='\0';
fscanf(stdin,"%d",&N);
fgetc(stdin);
for(i=0;i