C++ 热搜榜设计:实现关键词排序和热度统计

最近 Eron 的社交软件爆火,他准备请你设计一个'热搜榜',来显示最新的热门搜索,但是出于保密,他不会告诉你热搜的关键词是什么,所有的关键词会使用数字来代替。

Eron 给出了热搜榜的逻辑:一段时间内只能显示 10 个热搜,即热搜榜的上限是 10 个不同关键词,当热搜榜接收一个关键词时,若之前出现过该关键词,则直接增加该关键词的搜索数,该关键词不会进入热搜榜。若是之前未出现过的新关键词,便会进入热搜榜未使用的第一个位置,当热搜榜已经包含 10 个不同的关键词时,再进入新的关键词,便需要删除最早进入热搜榜的关键词,并清除对应的搜索次数。请你设计一个程序,输入搜索次数和若干关键词,输出最后的热搜榜,注意:热搜榜按搜索次数从大到小输出,若搜索次数相同则按输入顺序输出。

输入描述

2 行,第 1 行包含一个整数 n, 代表总搜索数 第 2 行包含 n 个整数,代表搜索关键词

输出描述

1 行,含 10 个整数,代表热搜榜的十个关键词,每个关键词之间用空格隔开。

样例 1

输入

12
1 1 2 3 4 5 6 7 8 9 10 9

输出

1 9 2 3 4 5 6 7 8 10

样例 2

输入

14
1 1 2 3 4 5 6 7 8 9 10 9 11 1

输出

9 3 4 5 6 7 8 10 11 1

提示

对于 30% 的数据 10<=n<=50。

对于 100% 的数据 10<=n<=1000。

对于 100% 的数据 10<=关键词种类<=100

代码内容

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

struct Keyword {
    int num;
    int count;
};

bool cmp(Keyword a, Keyword b) {
    if (a.count == b.count) {
        return a.num < b.num;
    }
    return a.count > b.count;
}

int main() {
    int n;
    cin >> n;
    
    vector<int> search(n);
    for (int i = 0; i < n; i++) {
        cin >> search[i];
    }
    
    unordered_map<int, int> countMap;
    vector<Keyword> keywords;
    
    for (int i = 0; i < n; i++) {
        if (countMap.find(search[i]) == countMap.end()) {
            if (keywords.size() < 10) {
                countMap[search[i]] = i;
                keywords.push_back({search[i], 1});
            } else {
                int minIndex = keywords[0].num;
                int minCount = keywords[0].count;
                for (int j = 1; j < 10; j++) {
                    if (keywords[j].count < minCount) {
                        minIndex = j;
                        minCount = keywords[j].count;
                    }
                }
                countMap.erase(keywords[minIndex].num);
                countMap[search[i]] = i;
                keywords[minIndex] = {search[i], 1};
            }
        } else {
            int index = countMap[search[i]];
            keywords[index].count++;
        }
    }
    
    sort(keywords.begin(), keywords.end(), cmp);
    
    for (int i = 0; i < 10; i++) {
        cout << keywords[i].num << " ";
    }
    
    return 0;
}
C++ 热搜榜设计:实现关键词排序和热度统计

原文地址: https://www.cveoy.top/t/topic/o8Eu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录