目录
华为OD机试 2023B卷题库疯狂收录中,刷题++点这里++
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页URLtopN。请设计一个算法,可以高效动态统计TopN的页面。
二、输入描述
每一行都是一个URL或一个数字,如果是URL,代表一段时间内的网页访问; 如果是一个数字N,代表本次需要输出的TopN个URL。
输入约束:
1、总访问网页数量小于5000个,单网页访问次数小于65535次:
2、网页URL仅由字母,数字和点分隔符组成,且长度小于等于127字节:
3、数字是正整数,小于等于10且小于当前总访问网页数;
三、输出描述
每行输入要对应一行输出,输出按访问次数排序的前N个URL,用逗号分隔。
输出要求:
- 每次输出要统计之前所有输入,不仅是本次输入;
- 如果有访问次数相等的URL,按URL的字符串字典序升序排列,输出排序靠前的URL;
四、解题思路
- 判断字符串是否是整数;
- 如果不是整形,则是网址,则将其加入map中,key是网址,value是该网址个数
- 如果是整形,将map放入list中,并按照网址个数value降序排序;
- 获取前N个网址
- 获取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、输入
3
2、输出
news.qq.com,game.163.com,news.sina.com.cn
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。