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

相关推荐
蓝桉80210 分钟前
图片爬取案例
开发语言·数据库·python
逸狼16 分钟前
【JavaEE进阶】Spring DI
java·开发语言
yonuyeung19 分钟前
代码随想录算法【Day54】
java·数据结构·算法
敲上瘾25 分钟前
基础dp——动态规划
java·数据结构·c++·python·算法·线性回归·动态规划
my_styles1 小时前
2025-alibaba-Sentinel组件
java·开发语言·sentinel
Dongwoo Jeong1 小时前
类型系统下的语言分类与类型系统基础
java·笔记·python·lisp·fortran·type
肖帆咪1 小时前
deepseek自动化代码生成
java·ai·自动化·ai编程·deepseek
刘小炮吖i1 小时前
Java 集合:单列集合和双列集合的深度剖析
java·集合
float_六七1 小时前
Java——单例类设计模式
java·单例模式·设计模式