华为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在线答疑。

相关推荐
weixin_4624462318 小时前
一键安装 Hadoop 3.3.6 自动化脚本详解 |(含 JAVA_HOME 自动配置)
java·hadoop·自动化
Rabbit_QL1 天前
【水印添加工具】从零设计一个工程级 Python 图片水印工具:WaterMask 架构与实现
开发语言·python
张柏慈1 天前
Java性能优化:实战技巧与案例解析
java
天“码”行空1 天前
简化Lambda——方法引用
java·开发语言
z20348315201 天前
C++对象布局
开发语言·c++
Beginner x_u1 天前
如何解释JavaScript 中 this 的值?
开发语言·前端·javascript·this 指针
带刺的坐椅1 天前
MCP 进化:让静态 Tool 进化为具备“上下文感知”的远程 Skills
java·ai·llm·agent·solon·mcp·tool-call·skills
java1234_小锋1 天前
Java线程之间是如何通信的?
java·开发语言
张张努力变强1 天前
C++ Date日期类的设计与实现全解析
java·开发语言·c++·算法
无限码力1 天前
华为OD技术面真题 - JAVA开发 - 1
华为od·华为od技术面真题·华为od技术面八股·华为od技术面java真题·华为od技术面java八股·华为od技术面题