系统设计题-路由表最长匹配

一、题目

路由表最长匹配:将目标IP地址dstIP与路由为entryIP/掩码长度m(比如10.166.50.0/23)进行匹配,找出匹配掩码m最长值。
匹配规则
如果dstIP和entryIP的二进制表示的前m个位相同,则说明是匹配的。
0.0.0.0是默认路由,与任何dstIP均匹配,m值为0。
所有匹配的路由中,m的最大值即为“最长匹配”

二、样例

第一行是dstIP
第二行是总entryIP数
第三行之后是具体的entryIP/m

192.168.0.3
6
10.166.50.0/23
192.0.0.0/0
10.255.255.255/32
192.168.0.1/24
127.0.0.0/0
192.168.0.0.0/24
输出
192.168.0.1/24

三、代码实现

    // ipTable是个二维数组,每一个数组中第0列存IP,第1列存掩码
    private static String routeSearch(String dstIp, String[][] ipTable) {
        String dstIpBinary = getRoute(dstIp);
        LinkedList<String> maxMatchList = new LinkedList<>();
        int maxMatch = -1;
        for (String[] strings : ipTable) {
            String tempRoute = strings[0];
            int maxNum = Integer.parseInt(strings[1]);
            if (tempRoute.equals("0.0.0.0") && maxNum == 0) {
                maxMatch = maxNum;
                maxMatchList.add(tempRoute + "/" + maxNum);
                continue;
            }
            if (isMatch(dstIpBinary, getRoute(tempRoute), maxNum) && maxNum > maxMatch) {
                maxMatchList.clear();
                maxMatch = maxNum;
                maxMatchList.add(tempRoute + "/" + maxNum);
            }
        }

        if (maxMatchList.isEmpty()) {
            return "empty";
        }
        return maxMatchList.getFirst();
    }

    // 判断在给定matchNum长度下,是否匹配
    private static boolean isMatch(String src, String ds, int matchNum) {
        for (int i = 0; i < matchNum; i++) {
            if (src.charAt(i) != ds.charAt(i)) {
                return false;
            }
        }
        return true;
    }

    // 将IP地址转换成二进制
    private static String getRoute(String s) {
        String[] ipSplit = s.split("\\.");
        StringBuilder stringBuilder = new StringBuilder();
        for (String ip : ipSplit) {
            // 转换成二进制,不足8位,则补0
            String binaryString = Integer.toBinaryString(Integer.parseInt(ip));
            String formatBinaryStr = String.format("%8s", binaryString);
            formatBinaryStr = formatBinaryStr.replace(" ", "0");
            stringBuilder.append(formatBinaryStr);
        }
        return stringBuilder.toString();
    }

相关推荐

  1. 系统设计-匹配

    2024-07-11 04:44:05       23 阅读
  2. vue混入、、动态匹配

    2024-07-11 04:44:05       62 阅读
  3. react-router 的匹配逻辑

    2024-07-11 04:44:05       27 阅读
  4. 力扣浅至深 每日一.04 公共前缀

    2024-07-11 04:44:05       44 阅读
  5. 页面router设计

    2024-07-11 04:44:05       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 04:44:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 04:44:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 04:44:05       57 阅读
  4. Python语言-面向对象

    2024-07-11 04:44:05       68 阅读

热门阅读

  1. springboot+vue项目实战2024第三集修改用户信息

    2024-07-11 04:44:05       26 阅读
  2. stm32实现软件spi

    2024-07-11 04:44:05       23 阅读
  3. 什么是生物环保?

    2024-07-11 04:44:05       23 阅读
  4. golang interface指针实现

    2024-07-11 04:44:05       20 阅读
  5. 自然语言处理(NLP)技术

    2024-07-11 04:44:05       18 阅读
  6. KKT条件

    2024-07-11 04:44:05       22 阅读
  7. vscode离线方式远程到没有网络的服务器上

    2024-07-11 04:44:05       18 阅读