题目描述
企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页URL top N。请设计一个算法,可以高效动态统计Top N的页面。
输入描述
每一行都是一个URL或一个数字,如果是URL,代表一段时间内的网页访问;
如果是一个数字N,代表本次需要输出的Top N个URL。
输入约束:
1、总访问网页数量小于5000个,单网页访问次数小于65535次;
2、网页URL仅由字母,数字和点分隔符组成,且长度小于等于127字节;
3、数字是正整数,小于等于10且小于当前总访问网页数;
输出描述
每行输入要对应一行输出,输出按访问次数排序的前N个URL,用逗号分隔。
输出要求:
1、每次输出要统计之前所有输入,不仅是本次输入;
2、如果有访问次数相等的URL,按URL的字符串字典序升序排列,输出排序靠前的URL;
用例
| 输入 | news.qq.comnews.sina.com.cnnews.qq.comnews.qq.comgame.163.comgame.163.comwww.huawei.comwww.cctv.com3www.huawei.comwww.cctv.comwww.huawei.comwww.cctv.comwww.huawei.comwww.cctv.comwww.huawei.comwww.cctv.comwww.huawei.com3 |
| 输出 | news.qq.com,game.163.com,news.sina.com.cnwww.huawei.com,www.cctv.com,news.qq.com |
| 说明 | 无 |
| 输入 | news.qq.comwww.cctv.com1www.huawei.comwww.huawei.com23 |
| 输出 | news.qq.comwww.huawei.com,news.qq.comwww.huawei.com,news.qq.com,www.cctv.com |
| 说明 | 无 |
原文链接
【华为OD机试 】 热点网站统计(C++ Java JavaScript Python)
C++
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <regex>
using namespace std;
string sortURL(vector<string>& lines, map<string, int>& cache);
int main() {
vector<string> lines; // 创建一个字符串列表,用于存储输入的每一行数据
map<string, int> cache; // 创建一个哈希表,用于存储每个 URL 出现的次数
string line;
while (getline(cin, line)) { // 不断读取输入,直到没有下一行
lines.push_back(line); // 将该行数据添加到字符串列表中
if (regex_match(line, regex("^\\d+$"))) { // 如果该行数据只包含数字,说明已经读取完了一个测试用例
cout << sortURL(lines, cache) << endl; // 调用 sortURL 方法进行处理,并输出结果
lines.clear(); // 清空字符串列表,为下一个测试用例做准备
}
}
return 0;
}
string sortURL(vector<string>& lines, map<string, int>& cache) {
int n = stoi(lines.back()); // 从字符串列表中取出最后一个元素,即需要输出的 URL 数量
lines.pop_back(); // 删除最后一个元素
for (string url : lines) { // 遍历字符串列表中的每一个 URL
cache[url]++; // 将该 URL 在哈希表中的计数加一
}
vector<pair<string, int>> list(cache.begin(), cache.end()); // 将哈希表中的每一项转换成一个键值对,并存入一个列表中
sort(list.begin(), list.end(), [](const pair<string, int>& a, const pair<string, int>& b) { // 对列表进行排序,按照计数从大到小排序,如果计数相同则按照字典序从小到大排序
if (a.second != b.second) {
return a.second > b.second;
} else {
return a.first < b.first;
}
});
string res;
for (int i = 0; i < n && i < list.size(); i++) { // 取出前 n 个 URL,并将它们拼接成一个字符串
res += list[i].first + ",";
}
if (!res.empty()) { // 如果字符串不为空,则删除最后一个逗号
res.pop_back();
}
return res; // 返回拼接好的字符串
}