华为OD机试 - 热点网站统计 - 逻辑分析(Java 2023 B卷 100分)

目录

华为OD机试 2023B卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页URLtopN。请设计一个算法,可以高效动态统计TopN的页面。

二、输入描述

每一行都是一个URL或一个数字,如果是URL,代表一段时间内的网页访问; 如果是一个数字N,代表本次需要输出的TopN个URL。

输入约束:

1、总访问网页数量小于5000个,单网页访问次数小于65535次:

2、网页URL仅由字母,数字和点分隔符组成,且长度小于等于127字节:

3、数字是正整数,小于等于10且小于当前总访问网页数;

三、输出描述

每行输入要对应一行输出,输出按访问次数排序的前N个URL,用逗号分隔。

输出要求:

  1. 每次输出要统计之前所有输入,不仅是本次输入;
  2. 如果有访问次数相等的URL,按URL的字符串字典序升序排列,输出排序靠前的URL;

四、解题思路

  1. 判断字符串是否是整数;
    • 如果不是整形,则是网址,则将其加入map中,key是网址,value是该网址个数
    • 如果是整形,将map放入list中,并按照网址个数value降序排序;
  2. 获取前N个网址
  3. 获取map中的key,并进行逗号分隔输出;

五、Java算法源码

java 复制代码
package com.guor.od;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class OdTest {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String input = sc.nextLine();
            // 判断字符串是否是整数
            if (isNumeric(input)) {
                Integer num = Integer.parseInt(input);
                List<Map.Entry<String, Integer>> mapList = new ArrayList<>(map.entrySet());
                // 根据网址的个数降序排序
                mapList.sort((o1, o2) -> {
                    if (o1.getValue() != o2.getValue()) {
                        return o2.getValue() - o1.getValue();
                    } else {
                        return o1.getKey().compareTo(o2.getKey());
                    }
                });

                // 获取前N个网址
                List<Map.Entry<String, Integer>> subList = mapList.subList(0, num);
                // 获取map中的key,并进行逗号分隔输出
                String keys = subList.stream().map(Map.Entry::getKey).collect(Collectors.joining(","));
                System.out.println(keys);
            } else {
                // 如果是网址,则将其加入map中,key是网址,value是该网址个数
                map.put(input, map.getOrDefault(input, 0) + 1);
            }
        }
    }

    /**
     * 判断字符串是否是整数
     */
    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        return isNum.matches();
    }
}

六、效果展示

1、输入

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

2、输出

news.qq.com,game.163.com,news.sina.com.cn

🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
.简.简.单.单.15 小时前
Design Patterns In Modern C++ 中文版翻译 第八章 组合
java·c++·设计模式
yyy(十一月限定版)15 小时前
C语言——堆
c语言·开发语言·算法
澜莲花15 小时前
python图色之opencv基础
开发语言·图像处理·python·opencv
喜欢吃燃面15 小时前
算法竞赛中的数据结构:图
开发语言·数据结构·c++·学习·算法
黎雁·泠崖15 小时前
C 语言动态内存管理入门:malloc/calloc/realloc/free 核心函数详解
c语言·开发语言
哈市雪花15 小时前
记录一次cmake无法正确使用vcpkg的问题
开发语言·c++
Yue丶越15 小时前
【C语言】文件操作
服务器·c语言·开发语言
七夜zippoe15 小时前
Spring MVC请求处理流程源码分析与DispatcherServlet核心逻辑
java·spring·mvc·过滤器·拦截器
笙枫15 小时前
Agent 进阶设计:状态管理、中间件与多Agent协作
java·服务器·python·ai·中间件
Trouvaille ~15 小时前
【C++篇】C++11新特性详解(三):高级特性与实用工具
开发语言·c++·stl·lambda·完美转发·包装器·可变参数模版