【HUAWEI OJ 题库】路由表最长匹配

2024-01-11 04:10

本文主要是介绍【HUAWEI OJ 题库】路由表最长匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

路由表最长匹配是IP(v4) 路由器的最基本的功能之一,当路由器收到一个IP数据包时,会将数据包的目的IP地址与本地路由表进行匹配。
格式:目的IP地址为dstIP,路由表中每条路由为entryIP/掩码长度m,如 10.166.50.0/23。
注:所有IP地址以点分十进制字符串表示。
匹配规则:
如果 entryIP 和 dstIP 的二进制表示的前 m 个bit相同,则说明该条路由是匹配的。
注:10.166.50.0的二进制表示如下:
在这里插入图片描述
0.0.0.0/0是默认路由,它与任何目的IP地址都是匹配的,m 值为 0 。
所有匹配的路由中,m 最大的即为“最长匹配”。

现给出目的IP地址和本地路由表,请输出最长匹配的路由;如果有多条,则按给出的先后顺序输出最先的;如果没有匹配的,输出字符串empty。

解答要求
时间限制:1000ms, 内存限制:256MB

输入

第一行是目的IP地址,点分十进制表示的字符串。
第二行一个整数 n,表示路由表中的路由数量,取值范围为 [1, 10000]。
接下来 n 行表示 n 条路由,其中掩码长度 m 的取值范围为[0, 32],m 值为 0 仅存在于路由 0.0.0.0/0 。

输出

最长匹配的路由,格式同输入;如果没有则输出字符串empty。

样例

输入样例 1

192.168.0.3
6
10.166.50.0/23
192.0.0.0/8
10.255.255.255/32
192.168.0.1/24
127.0.0.0/8
192.168.0.0/24

输出样例 1

192.168.0.1/24

提示样例 1

匹配的路由如下图所示,先按匹配的长度,再按输入先后顺序,结果为192.168.0.1/24

在这里插入图片描述
输入样例 2

202.96.96.68
1
200.18.24.0/24

输出样例 2

empty

提示样例 2

200.18.24.0/24 不匹配;

输入样例 3

10.110.32.77
2
127.0.0.1/8
0.0.0.0/0

输出样例 3

0.0.0.0/0

提示样例 3

127.0.0.1/8 不匹配; 0.0.0.0/0 是默认路由,是匹配的,且是唯一匹配的。

提示

注:可以用十进制数掩码长度来简单表示一个子网掩码,掩码长度指的是二进制子网掩码中连续1的个数,例如掩码长度 24 表示子网掩码的二进制形式为11111111.11111111.11111111.00000000(十进制形式为:255.255.255.0; 长度24不包括分隔符点),掩码长度 27 表示子网掩码的二进制形式为11111111.11111111.11111111.11100000(十进制形式为255.255.255.224)

编码实现(Java)

    public static void main(String[] args) {String dstIp = "192.168.0.3";String[][] ipTable = {{"10.166.50.0", "23"},{"192.0.0.0", "8"},{"10.255.255.255", "32"},{"192.168.0.1", "24"},{"127.0.0.0", "8"},{"192.168.0.0", "24"}};String result = routerSearch(dstIp, ipTable);System.out.println(result);}private static String routerSearch(String dstIp, String[][] ipTable) {int maxMatchLen = -1;String longestRoute = "empty";for (String[] route : ipTable) {String routeIp = route[0];int maskLen = Integer.parseInt(route[1]);String[] routeIpParts = routeIp.split("\\.");String[] dstIpParts = dstIp.split("\\.");int matchLen = 0;for (int i = 0; i < Math.min(routeIpParts.length, dstIpParts.length); i++) {String routeBinary = String.format("%8s", Integer.toBinaryString(Integer.parseInt(routeIpParts[i]))).replace(' ', '0');String dstBinary = String.format("%8s", Integer.toBinaryString(Integer.parseInt(dstIpParts[i]))).replace(' ', '0');for (int j = 0; j < routeBinary.length(); j++) {if (routeBinary.charAt(j) == dstBinary.charAt(j)) {matchLen++;} else {break;}}}if (matchLen >= maskLen && matchLen > maxMatchLen) {maxMatchLen = matchLen;longestRoute = routeIp + "/" + maskLen;}}return longestRoute;}

优化后代码

    public static void main(String[] args) {String dstIp = "192.168.0.3";String[][] ipTable = {{"10.166.50.0", "23"},{"192.0.0.0", "8"},{"10.255.255.255", "32"},{"192.168.0.1", "24"},{"127.0.0.0", "8"},{"192.168.0.0", "24"}};String result = routerSearch(dstIp, ipTable);System.out.println(result);}private static String routerSearch(String dstIp, String[][] ipTable) {int maxMatchLen = -1;String longestRoute = "empty";for (String[] route : ipTable) {String routeIp = route[0];int maskLen = Integer.parseInt(route[1]);String[] routeIpParts = routeIp.split("\\.");String[] dstIpParts = dstIp.split("\\.");int matchLen = 0;for (int i = 0; i < routeIpParts.length; i++) {int routePart = Integer.parseInt(routeIpParts[i]);int dstPart = Integer.parseInt(dstIpParts[i]);int commonPrefix = Integer.numberOfLeadingZeros(routePart ^ dstPart);matchLen += commonPrefix;if (commonPrefix < 8) {break;}}if (matchLen >= maskLen && matchLen > maxMatchLen) {maxMatchLen = matchLen;longestRoute = routeIp + "/" + maskLen;}}return longestRoute;}

输出结果

192.168.0.1/24Process finished with exit code 0

这篇关于【HUAWEI OJ 题库】路由表最长匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/593119

相关文章

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2