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

相关推荐
斯奕sky_small-BAD2 分钟前
C++ if语句完全指南:从基础到工程实践
java·开发语言·php
云之渺4 分钟前
125java
java
都叫我大帅哥4 分钟前
Java ReentrantLock:从“舔狗式等待”到源码级征服指南
java
程序员岳焱11 分钟前
Java 高级泛型实战:8 个场景化编程技巧
java·后端·编程语言
Humbunklung12 分钟前
Rust Floem UI 框架使用简介
开发语言·ui·rust
钢铁男儿21 分钟前
C# 类和继承(扩展方法)
java·servlet·c#
饮长安千年月27 分钟前
JavaSec-SpringBoot框架
java·spring boot·后端·计算机网络·安全·web安全·网络安全
移动开发者1号28 分钟前
Android 大文件分块上传实战:突破表单数据限制的完整方案
android·java·kotlin
代码匠心29 分钟前
从零开始学Flink:揭开实时计算的神秘面纱
java·大数据·后端·flink
jie1889457586644 分钟前
C++ 中的 const 知识点详解,c++和c语言区别
java·c语言·c++