【华为OD-E卷 - 热点网站统计 100分(python、java、c++、js、c)】

【华为OD-E卷 - 热点网站统计 100分(python、java、c++、js、c)】

题目

企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页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

python解法

  • 解题思路:
  • 这段代码实现了一个简单的 URL 计数器,能够实时统计 URL 的访问次数,并按要求输出访问次数最多的 URL。以下是具体功能和解题思路:

URL 统计功能:使用 Python 的 collections.Counter 数据结构对输入的 URL 进行计数。Counter 是一个专门用于计数的字典,键是 URL,值是对应 URL 出现的次数。

按条件输出:

如果输入的是一个数字 n,输出访问次数最高的前 n 个 URL。
如果输入的是一个 URL,则更新该 URL 的计数。
排序逻辑:

先按访问次数从高到低排序。
如果访问次数相同,则按 URL 的字典序排列。
输入与退出:

程序通过循环接受用户的输入。
遇到 EOFError(如用户使用 Ctrl+D 或 Ctrl+Z)时,退出程序

from collections import Counter  # 导入 Counter 用于统计 URL 的出现次数# 创建一个 Counter 对象,用于统计 URL 访问次数
url_counter = Counter()# 定义一个函数,用于获取访问次数最多的前 n 个 URL
def get_top_n_urls(n):# 将 URL 按访问次数降序排序,如果次数相同按字典序升序排列sorted_urls = sorted(url_counter.items(), key=lambda x: (-x[1], x[0]))# 提取前 n 个 URL,并用逗号连接成字符串返回return ",".join(url for url, _ in sorted_urls[:n])try:# 循环不断读取用户输入while True:input_value = input().strip()  # 去掉输入的前后空格if input_value.isnumeric():  # 如果输入的是纯数字# 将输入转换为整数并获取访问次数最多的前 n 个 URLprint(get_top_n_urls(int(input_value)))else:  # 如果输入的是一个字符串(假设是 URL)# 更新该 URL 的访问次数url_counter[input_value] += 1
except EOFError:# 遇到 EOFError(如用户按 Ctrl+D 或 Ctrl+Z)时退出程序pass

java解法

  • 解题思路
  • 这段代码实现了一个实时统计 URL 访问次数的功能,同时可以根据用户输入的数量 n 输出访问次数最多的前 n 个 URL。以下是解题步骤和逻辑:

数据存储与统计:

使用 TreeMap 存储 URL 及其对应的访问次数,TreeMap 会按键的字典序自动排序,方便管理和检索。
URL 的访问次数通过 getOrDefault 方法更新。
获取访问次数最多的 URL:

使用 PriorityQueue(优先队列)对 TreeMap 的 entrySet 进行排序。
排序规则:
优先按访问次数降序排列。
如果访问次数相同,则按 URL 的字典序升序排列。
最终输出按排序规则选取的前 n 个 URL。
输入处理:

如果输入是数字,调用 getTopN 方法输出结果。
如果输入是 URL,更新 URL 访问次数。
异常处理:

在 isNumeric 方法中捕获非数字输入的异常,确保程序不会因为非法输入而崩溃

import java.util.*;public class Main {// 用 TreeMap 存储 URL 和其访问次数,按字典序自动排序static Map<String, Integer> urlCount = new TreeMap<>();// 用 PriorityQueue 实现访问次数和字典序的自定义排序static PriorityQueue<Map.Entry<String, Integer>> pq;public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 循环读取用户输入while (sc.hasNextLine()) {String input = sc.nextLine();// 如果输入是数字if (isNumeric(input)) {int n = Integer.parseInt(input); // 将输入转换为整数System.out.println(getTopN(n)); // 获取访问次数最多的 n 个 URL} else {// 如果输入是 URL,更新其访问次数urlCount.put(input, urlCount.getOrDefault(input, 0) + 1);}}}/*** 获取访问次数最多的前 n 个 URL** @param n 前 n 个 URL* @return 按要求排序的前 n 个 URL,使用逗号分隔*/private static String getTopN(int n) {// 定义优先队列,按访问次数降序排列,如果次数相同按字典序升序pq = new PriorityQueue<>((a, b) -> {if (!a.getValue().equals(b.getValue())) {return b.getValue() - a.getValue(); // 按访问次数降序} else {return a.getKey().compareTo(b.getKey()); // 按字典序升序}});// 将 TreeMap 中的所有条目加入优先队列pq.addAll(urlCount.entrySet());// 使用 StringJoiner 拼接结果StringJoiner sj = new StringJoiner(",");for (int i = 0; i < n && !pq.isEmpty(); i++) {sj.add(pq.poll().getKey()); // 取出队列中最优先的 URL}return sj.toString();}/*** 判断字符串是否为数字** @param str 输入字符串* @return 如果是数字返回 true,否则返回 false*/private static boolean isNumeric(String str) {try {Integer.parseInt(str); // 尝试将字符串转换为整数return true;} catch (NumberFormatException e) {return false; // 转换失败说明不是数字}}
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

  • 这段代码用 Node.js 实现了一个实时统计 URL 访问次数的功能,可以根据用户输入的数字 n 输出访问次数最多的前 n 个 URL。以下是代码的解题思路:

数据结构选用:

使用对象 urlVisits 存储 URL 和对应的访问次数。
urlVisits 的键为 URL,值为该 URL 的访问次数。
输入处理:

如果输入是 URL,则更新 urlVisits 中对应 URL 的访问次数。
如果输入是数字,则按规则排序并输出访问次数最多的前 n 个 URL。
排序规则:

按访问次数降序排序。
如果访问次数相同,按字典序升序排序。
异步输入:

使用 Node.js 的 readline 模块实现异步输入,允许用户连续输入。
输出处理:

将排序后的前 n 个 URL 提取并用逗号拼接输出

// 使用 readline 模块处理用户输入
const readline = require("readline").createInterface({ input: process.stdin });// 创建一个异步迭代器用于读取输入
const iterator = readline[Symbol.asyncIterator]();// 定义一个异步函数来获取输入
const getInput = async () => (await iterator.next()).value;(async function () {// 用对象存储 URL 和访问次数const urlVisits = {};// 异步循环处理输入while ((input = await getInput())) {// 将输入尝试转换为数字const number = parseInt(input);if (isNaN(number)) {// 如果输入不是数字,视为 URL,更新访问次数urlVisits[input] = (urlVisits[input] ?? 0) + 1;continue;}// 如果输入是数字,按规则排序并输出前 n 个 URLconst result = Object.entries(urlVisits) // 将对象转为 [key, value] 数组.sort((first, second) => second[1] - first[1] || // 先按访问次数降序排序first[0].localeCompare(second[0]) // 再按字典序升序排序).slice(0, number) // 获取前 n 个元素.map((item) => item[0]) // 提取 URL.join(","); // 拼接成逗号分隔的字符串console.log(result); // 输出结果}
})();

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装Cockpit服务,使用Web页面管理你的Linux服务器

说起管理 Linux 服务器&#xff0c;大家首先想到的使用 SecureCRT、Xshell、MobaXterm 等工具远程到服务器&#xff0c;然后使用命令行管理服务器。今天给大家介绍一个好玩的工具&#xff0c;名字叫Cockpit&#xff0c; Cockpit 是一个免费开源的基于 web 的 Linux 服务器管理…

[A-25]ARMv8/v9-GIC的系统架构(中断的硬件基础)

ver0.1 前言 我们在观看很多的影视剧过程中,尤其是军旅体裁类型的布景中,经常会看见高级干部的办公桌上都会有几部电话机。这样的电话可不能小看,重要的事情尤其是突发和紧急的情况都要通过这几部电话第一时间通知给决策者。这几部电话,必须举报几个特点:及时性好、稳定…

ffmpeg将mp4等文件转mp3

安装ffmpeg 目录 安装ffmpeg macOS Windows 实现方法 Base Golang macOS 在macOS上,你可以使用Homebrew来安装FFmpeg,这是最简单和推荐的方法。以下是具体步骤: ‌安装Homebrew‌(如果尚未安装): 打开终端,执行以下命令来安装Homebrew: /bin/bash -c "$(c…

13-线段的转折点样式

13-线段的转折点样式_哔哩哔哩_bilibili13-线段的转折点样式是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第14集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://www.bi…

计算机网络 (28)虚拟专用网VPN

前言 虚拟专用网络&#xff08;VPN&#xff09;是一种在公共网络上建立私有网络连接的技术&#xff0c;它允许远程用户通过加密通道访问内部网络资源&#xff0c;实现远程办公和安全通信。 一、基本概念 定义&#xff1a;VPN是一种通过公共网络&#xff08;如互联网&#xff09…

基于transformer的目标检测:DETR

目录 一、背景介绍 二、DETR的工作流程 三、DETR的架构 1. 损失函数 2. 网络框架讲解及举例 一、背景介绍 在深度学习和计算机视觉领域&#xff0c;目标检测一直是一个核心问题。传统方法依赖于复杂的流程和手工设计的组件&#xff0c;如非极大值抑制&#xff08;nms&…

代码随想录18

20. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有…

Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)

Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript&#xff0c;都是单文件组件 (SFC)&#xff0c;支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库&#xff0c;包含丰富的 UI 组件和常…

git:指令集

以下是对这些 Git 新特性和命令的更详细解读和实际用例分析&#xff0c;帮助更好地理解它们的作用及适用场景&#xff1a; 1. git switch 和 git restore 背景&#xff1a; 传统上&#xff0c;git checkout 是一个多功能命令&#xff0c;用于切换分支、检出文件、创建分支等&…

C语言----指针

目录 1.概念 2.格式 3.指针操作符 4.初始化 1. 将普通变量的地址赋值给指针变量 a. 将数组的首地址赋值给指针变量 b. 将指针变量里面保存的地址赋值给另一个指针变量 5.指针运算 5.1算术运算 5.2 关系运算 指针的大小 总结&#xff1a; 段错误 指针修饰 1. con…

ElasticSearch系列(一)

一.了解ES、倒排索引、es的一些概念、安装es、kibana 二.DSL&#xff1b;索引库操作 三.Java RestClient&#xff1a;索引库操作 一、了解ES、倒排索引、es的一些概念、安装es、kibana kibana、logstash、beats Elasticserach 存储&#xff0c;计算 &#xff0c;搜索数据 –…

Python应用——将Matplotlib图形嵌入Tkinter窗口

Python应用——将Matplotlib图形嵌入Tkinter窗口 目录 Python应用——将Matplotlib图形嵌入Tkinter窗口1 模块简介2 示例代码2.1 Matplotlib嵌入Tkinter2.2 Matplotlib嵌入Tkinter并显示工具栏 1 模块简介 Tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;库&…

C#语言的网络编程

C#语言的网络编程 引言 随着互联网的飞速发展&#xff0c;网络编程成为了软件开发中的一个重要领域。C#语言作为一种现代编程语言&#xff0c;凭借其丰富的类库、良好的可读性和强大的功能&#xff0c;广泛应用于开发各种网络应用程序。无论是Windows应用、Web应用还是云服务…

软件工程大复习之(四)——面向对象与UML

4.1 面向对象概述 面向对象&#xff08;OO&#xff09;是一种编程范式&#xff0c;它将数据和处理数据的方法封装在对象中。面向对象的主要概念包括&#xff1a; 对象&#xff1a;实例化的数据和方法的集合。类&#xff1a;对象的蓝图或模板。封装&#xff1a;隐藏对象的内部…

【linux基础I/O(2)】理解文件系统|文件缓冲区|软硬链接|动静态库

目录 前言1. 理解C语言的缓冲区2. 对文件系统的初认识3. 理解软硬链接1. 软硬链接的特征2.软硬链接的作用 4. 理解动静态库5. 总结 前言 对于文件来讲,有打开的在内存中的文件,也有没有打开的在磁盘上文件,上一篇文章讲解的是前者,本篇文章将带大家了解后者! 本章重点: 本篇文…

什么是Redis的渐进式ReHash?

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ Redis 的渐进式 rehash 是一…

Linux应用软件编程--网络通信(udp协议,tcp协议)

网络通信&#xff1a;不同主机&#xff0c;进程间通信&#xff0c;分为广域网和局域网 OSI 七层模型&#xff1a;是一种理论模型 应用层&#xff1a;通信传输的数据内容 http、FTP、TFTP、MQTT 表述层&#xff1a;数据加密&#xff0c;解密操作&#xff0c;压缩&#xff…

深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题

在训练过程中&#xff0c;训练集的准确率稳步上升&#xff0c;但是验证集的准确率一直在40%左右徘徊&#xff0c;从网上搜索可能的原因有&#xff1a; 1、学习率太小&#xff0c;陷入局部最优。 2、数据量太小&#xff08;4000多条数据&#xff0c;应该还可以吧&#xff09; …

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

期刊选择【生物医学工程】

所有数据来源letpub Academic radiology【共一共通&#xff0c;速度√杠杠的】 【LetPub】ACADEMIC RADIOLOGY 影响因子3.800分&#xff0c;是几区&#xff0c;2023-2024年期刊投稿经验分享&#xff0c;ACADEMIC RADIOLOGY主页&#xff0c;推荐审稿人、编辑&#xff0c;审稿…