华为OD机试新系统真题目录包含(C/C++/Py/Java/Js/Go)题解点击查看: 华为OD机试新系统真题题库目录|机考题库 + 算法考点详解

题目描述

  • R类(保留地址): 0.0.0.0 0.0.0.0 0.0.0.0 ~ 0.255.255.255 0.255.255.255 0.255.255.255
  • A类: 1.0.0.0 1.0.0.0 1.0.0.0 ~ 126.255.255.255 126.255.255.255 126.255.255.255
  • L L L类(环回地址): 127.0.0.0 127.0.0.0 127.0.0.0 ~ 127.255.255.255 127.255.255.255 127.255.255.255
  • B B B类: 128.0.0.0 128.0.0.0 128.0.0.0 ~ 191.255.255.255 191.255.255.255 191.255.255.255
  • C C C类: 192.0.0.0 192.0.0.0 192.0.0.0 ~ 223.255.255.255 223.255.255.255 223.255.255.255
  • D D D类(组播地址): 224.0.0.0 224.0.0.0 224.0.0.0 ~ 239.255.255.255 239.255.255.255 239.255.255.255
  • E E E类(保留地址): 240.0.0.0 240.0.0.0 240.0.0.0 ~ 255.255.255.255 255.255.255.255 255.255.255.255

实现一个函数,输入一个IPv4地址,判断是哪一类IP地址,输出对应的类型:“ A A A”、“ B B B”、“ C C C”…;如果输入的IP地址不符合规范,则输出" F F F"。

IP地址合法性判定规则:

  1. IP地址由 4 4 4个整数组成,取值范围为 0 0 0 ~ 255 255 255
  2. .作为分割符分隔 4 4 4个数字

补充说明

题目中出现的数字,除了数字" 0 0 0"以外,不存在其他数字存在前导 0 0 0的情况,比如不会存在" 05 05 05"、" 010 010 010"等。

输入描述

输入一个IPV4地址

输出描述

输出对应的类型,如果输入IP地址不合法,输出F

样例1

输入

126.255.255.255

输出

A

说明

A A A类: 1.0.0.0 1.0.0.0 1.0.0.0 ~ 126.255.255.255 126.255.255.255 126.255.255.255

样例2

输入

191.255.255.255

输出

B

说明

B B B类: 128.0.0.0 128.0.0.0 128.0.0.0 ~ 191.255.255.255 191.255.255.255 191.255.255.255

样例3

输入

223.255.255.255

输出

C

说明

C C C类: 192.0.0.0 192.0.0.0 192.0.0.0 ~ 223.255.255.255 223.255.255.255 223.255.255.255

样例4

输入

239.255.255.255

输出

F

说明

D D D类: 224.0.0.0 224.0.0.0 224.0.0.0 ~ 239.255.255.255 239.255.255.255 239.255.255.255(组播地址)

样例5

输入

255.255.255.255

输出

E

说明

E E E类: 240.0.0.0 240.0.0.0 240.0.0.0 ~ 255.255.255.255 255.255.255.255 255.255.255.255(保留地址)

样例6

输入

a.0.0.0

输出

F

说明

a非数字

样例7

输入

0.0.0.1

输出

R

说明

保留地址: 0.0.0.0 0.0.0.0 0.0.0.0 ~ 0.255.255.255 0.255.255.255 0.255.255.255

样例8

输入

127.0.0.1

输出

L

说明

环回地址: 127.0.0.0 127.0.0.0 127.0.0.0 ~ 127.255.255.255 127.255.255.255 127.255.255.255

题解

思路

思路:模拟

  1. 首先需要明确一个观点,不同类型的IP地址本质是一个IP范围,并且不同IP类型彼此不会发生重叠。
  2. 预处理每种类型IPV4地址的起始和结束,使用long类型存储,不能使用int会发生溢出。IP 地址 A.B.C.D 转整数的公式为:(A << 24) + (B << 16) + (C << 8) + D
  3. 解析要查询的IP地址,首先判断是否是有效IPV4地址,发生错误直接返回F主要考虑有以下几点:
    • 是否由四部分组成
    • 每部分是否只包含数字字符并且非空
    • 是否超过0-255的范围
  4. 解析出查询IP地址的ipValue,带入各个类型的区间range进行匹配range.begin <= ipValue && range.second >= ipValue如果成立,返回对应的类型即可。

c++代码实现

#include <cctype>
#include<iostream>
#include<vector>
#include<string>
#include <utility> 
#include <sstream>
#include<algorithm> 
#include<cmath>
#include<map>
using namespace std;

// 通用 切割函数 函数 将字符串str根据delimiter进行切割
vector<string> split(const string& str, const string& delimiter) {
    vector<string> result;
    size_t start = 0;
    size_t end = str.find(delimiter);
    while (end != string::npos) {
        result.push_back(str.substr(start, end - start));
        start = end + delimiter.length();
        end = str.find(delimiter, start);
    }
    // 添加最后一个部分
    result.push_back(str.substr(start));
    return result;
}

// 判断是否只包含数字字符
bool judge(string& str) {
    for (auto&c : str) {
        if (!isdigit(c)) {
            return false;
        }
    }
    return true;
}


// 解析ip返回对应long值,不合法返回-1
long parseIp(string ip) {
    vector<string> ipPart = split(ip, ".");
    if (ipPart.size() != 4) {
        return -1;
    }
    long res = 0;
    for (int i = 0; i < 4; i++) {
        string cur = ipPart[i];
        if (cur.empty() || cur.size() > 3 || !judge(cur)) {
            return -1;
        }
        long value = stol(cur);
        // 超过限制
        if (value > 255) {
            return -1;
        }
        res = (res << 8) + value;
    }
    return res;
}

string ipClassify(string& ip) {
    // 映射出每个分类起始和结束范围
    map<string, pair<long, long>> mp;
    mp["R"] = {parseIp("0.0.0.0"), parseIp("0.255.255.255")};
    mp["A"] = {parseIp("1.0.0.0"), parseIp("126.255.255.255")};
    mp["L"] = {parseIp("127.0.0.0"), parseIp("127.255.255.255")};
    mp["B"] = {parseIp("128.0.0.0"), parseIp("191.255.255.255")};
    mp["C"] = {parseIp("192.0.0.0"), parseIp("223.255.255.255")};
    mp["D"] = {parseIp("224.0.0.0"), parseIp("239.255.255.255")};
    mp["E"] = {parseIp("240.0.0.0"), parseIp("255.255.255.255")};

    long ipValue = parseIp(ip);
    if (ipValue == -1) {
        return "F";
    }
    // 判断所属类型
    for (auto& [key, range] : mp) {
        if (range.first <= ipValue && range.second >= ipValue) {
            return key;
        }
    }
    return "F";
}

int main() {
    string ip;
    getline(cin, ip);
    string res = ipClassify(ip);
    cout << res;
    return 0;
}


JAVA代码实现

import java.util.*;
import java.io.*;

public class Main {

    // 判断是否只包含数字字符
    public static boolean judge(String str) {
        for (char c : str.toCharArray()) {
            if (!Character.isDigit(c)) {
                return false;
            }
        }
        return true;
    }

    // 解析ip返回对应long值,不合法返回-1
    public static long parseIp(String ip) {
        String[] ipPart = ip.split("\\.");
        if (ipPart.length != 4) {
            return -1;
        }
        long res = 0;

        for (int i = 0; i < 4; i++) {
            String cur = ipPart[i];

            if (cur.isEmpty() || cur.length() > 3 || !judge(cur)) {
                return -1;
            }

            long value = Long.parseLong(cur);

            // 超过限制
            if (value > 255) {
                return -1;
            }

            res = (res << 8) + value;
        }

        return res;
    }

    public static String ipClassify(String ip) {

        // 映射出每个分类起始和结束范围
        Map<String, long[]> mp = new LinkedHashMap<>();

        mp.put("R", new long[]{parseIp("0.0.0.0"), parseIp("0.255.255.255")});
        mp.put("A", new long[]{parseIp("1.0.0.0"), parseIp("126.255.255.255")});
        mp.put("L", new long[]{parseIp("127.0.0.0"), parseIp("127.255.255.255")});
        mp.put("B", new long[]{parseIp("128.0.0.0"), parseIp("191.255.255.255")});
        mp.put("C", new long[]{parseIp("192.0.0.0"), parseIp("223.255.255.255")});
        mp.put("D", new long[]{parseIp("224.0.0.0"), parseIp("239.255.255.255")});
        mp.put("E", new long[]{parseIp("240.0.0.0"), parseIp("255.255.255.255")});

        long ipValue = parseIp(ip);

        if (ipValue == -1) {
            return "F";
        }

        // 判断所属类型
        for (Map.Entry<String, long[]> entry : mp.entrySet()) {
            String key = entry.getKey();
            long[] range = entry.getValue();

            if (range[0] <= ipValue && range[1] >= ipValue) {
                return key;
            }
        }

        return "F";
    }

    public static void main(String[] args) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String ip = br.readLine();

        String res = ipClassify(ip);

        System.out.println(res);
    }
}

华为OD机试新系统真题 - IP地址分类识别(C/C++/Py/Java/Js/Go)题解

更多推荐