C++ 热搜榜设计:实现关键词排序和热度统计
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;
}
原文地址: https://www.cveoy.top/t/topic/o8Eu 著作权归作者所有。请勿转载和采集!