【华为OD机试 】 热点网站统计(C++ Java JavaScript Python)

501 阅读2分钟

题目描述

企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页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.com
news.sina.com.cn
news.qq.com
news.qq.com
game.163.com
game.163.com
www.huawei.com
www.cctv.com
3
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
www.cctv.com
www.huawei.com
3
输出news.qq.com,game.163.com,news.sina.com.cn
www.huawei.com,www.cctv.com,news.qq.com
说明
输入news.qq.com
www.cctv.com
1
www.huawei.com
www.huawei.com
2
3
输出news.qq.com
www.huawei.com,news.qq.com
www.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; // 返回拼接好的字符串
}