7-46 新浪微博热门话题

➳ENTRY 新浪微博可以在发言中嵌入“话题”,即将发言中的话题文字写在一对“#”之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还会随时更新热门话题列表,并将最热门的话题放在醒目的位置推荐大家关注。

本题目要求实现一个简化的热门话题推荐功能,从大量英文(因为中文分词处理比较麻烦)微博中解析出话题,找出被最多条微博提到的话题。

输入格式:

输入说明:输入首先给出一个正整数N(≤ ),随后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 ...

Ω

第一次提交…

可以接受的啦,毕竟

AC只是coding中的冰淇淋,debug才是coding的正餐。

——沃滋基硕德

本题满分30分,我已经拿到了20分,看来 大势已去,让我们看下一题 又是一些非常微小的细节所导致的错误。 通过仔细阅读题目,不难发现【注意】里面有一句非常显眼的话说要用 **一 个 空 格** 分隔单词。 So easy的啦~读到空格的时候把后面的分隔符全部读掉就完事了。

哦对,空格可能在开头 哦对,非英文字母和数字的符号也会分隔 哦对,空格后面还可能是结束符’#’ 哦对,会不会’#’之间只有空格呢😅

[小手一点]

可以接受的啦,就差4分了呢~ Ten minutes later…

不科学啊,一个话题的情况怎么会出错呢,我试了∞个输入了

最后,我在网上找到别人AC的码来自己测试,刚输完一个人就傻了😅 通过更加仔细地阅读题目,不难发现 “如果这样的话题不唯一,则输出按字母序最小的话题,并在第三行输出And k more …” 也就是说,不存在”And 0 more …”的输出。

人老了,希望眼睛还健在。


Codeee

#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<string, int> tc;

int main()
{
    set<string> topics;
    map<string, int> topics_cnt;
    int n;
    cin >> n;
    getchar();
    string str, topic;
    for (int i = 0; i < n; ++i)
    {
        getline(cin, str);
        for (int j = 0; j < str.size(); ++j)
            if (str[j] == '#')
            {
                j += 1;
                while (str[j] != '#')
                {
                    if (isalnum(str[j]))
                        topic += str[j];
                    else //测试点2:非英文字母和数字符号也具有分词作用
                    {
                        while (!isalnum(str[++j]) && str[j] != '#');
                        if (str[j] != '#' && !topic.empty())
                            topic += ' ';
                        j -= 1;
                    }
                    ++j;
                }
                transform(topic.begin(), topic.end(), topic.begin(), ::tolower);
                topics.insert(topic);
                topic = "";
            }
        for (auto &t: topics)
            topics_cnt[t] += 1;
        topics.clear();
    }
    vector<tc> cup(topics_cnt.begin(), topics_cnt.end());
    sort(cup.begin(), cup.end(), [](tc &a, tc &b) { return a.second > b.second; });
    int index = 0;
    string hottest_topic = cup[0].first;
    while (++index < cup.size() && cup[index].second == cup[0].second)
        if (cup[index].first < hottest_topic)
            hottest_topic = cup[index].first;
    hottest_topic[0] = toupper(hottest_topic[0]);
    cout << hottest_topic << endl << cup[0].second << endl;
    if (index > 1) //测试点3
        cout << "And " << index - 1 << " more ...";
}

∑ 几点说明

  1. 基本思路:一条微博中的话题用set存储可以避免重复计算,读完一条微博后将set中的话题计数至map

  2. sort不能对map进行排序,因此先将原map放置于同类型pairvector中,再进行排序,排序完找最小话题

  3. 依然用transform函数将所有英文字母转换为小写,最后将首字母转换为大写

  4. 这里用到的isalnum函数用来判断字符是否为字母或数字

    函数
    作用
    islower(char c)是否为小写字母
    isupper(char c)是否为大写字母
    isdigit(char c)是否为数字
    isalpha(char c)是否为字母
    isalnum(char c)是否为字母或者数字
    toupper(char c)字母小写转大写
    tolower(char c)字母大写转小写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值