华为OD机试-IPv4地址转换成整数(Java 2024 B卷 100分)

题目描述

存在一种虚拟 IPv4 地址 Q,由 4 小节组成,每节的范围为 0~255,以 # 号间隔。虚拟 IPv4 地址可以转换为一个 32 位的整数。例如:

  • 128#0#255#255 转换为 32 位整数的结果为 21475491830x8000FFFF
  • 1#0#0#0 转换为 32 位整数的结果为 167772160x01000000

现以字符串 Q 形式给出一个虚拟 IPv4 地址,限制第 1 小节的范围为 1~128,即每一节范围分别为 (1~128)#(0~255)#(0~255)#(0~255)。要求每个 IPv4 地址只能对应到唯一的整数上。如果是非法 IPv4,返回 invalid IP

输入描述

输入一行,虚拟 IPv4 地址格式字符串。

输出描述

输出按照要求输出整型或者特定字符 invalid IP

示例

输入:

128#0#255#255

输出:

2147549183

输入:

1#0#0#0

输出:

16777216

输入:

129#0#0#0

输出:

invalid IP

解题思路

  1. 验证输入格式: 检查输入字符串是否包含 4 个小节,且每小节之间用 # 分隔。
  2. 验证每小节范围: 检查每小节的值是否在合法范围内(第 1 小节为 1~128,其余小节为 0~255)。
  3. 转换为整数: 将合法的 IPv4 地址转换为 32 位整数。
  4. 处理非法输入: 如果输入不合法,返回 invalid IP

代码实现

Java
public class Solution {
    public static String convertIPv4ToInt(String ip) {
        String[] parts = ip.split("#");
        if (parts.length != 4) {
            return "invalid IP";
        }

        try {
            int first = Integer.parseInt(parts[0]);
            int second = Integer.parseInt(parts[1]);
            int third = Integer.parseInt(parts[2]);
            int fourth = Integer.parseInt(parts[3]);

            if (first < 1 || first > 128 || second < 0 || second > 255 || third < 0 || third > 255 || fourth < 0 || fourth > 255) {
                return "invalid IP";
            }

            long result = ((long) first << 24) | (second << 16) | (third << 8) | fourth;
            return String.valueOf(result);
        } catch (NumberFormatException e) {
            return "invalid IP";
        }
    }

    public static void main(String[] args) {
        String ip1 = "128#0#255#255";
        System.out.println(convertIPv4ToInt(ip1)); // 2147549183

        String ip2 = "1#0#0#0";
        System.out.println(convertIPv4ToInt(ip2)); // 16777216

        String ip3 = "129#0#0#0";
        System.out.println(convertIPv4ToInt(ip3)); // invalid IP
    }
}
Python
def convert_ipv4_to_int(ip):
    parts = ip.split('#')
    if len(parts) != 4:
        return "invalid IP"

    try:
        first = int(parts[0])
        second = int(parts[1])
        third = int(parts[2])
        fourth = int(parts[3])

        if not (1 <= first <= 128 and 0 <= second <= 255 and 0 <= third <= 255 and 0 <= fourth <= 255):
            return "invalid IP"

        result = (first << 24) | (second << 16) | (third << 8) | fourth
        return str(result)
    except ValueError:
        return "invalid IP"

# Test cases
print(convert_ipv4_to_int("128#0#255#255"))  # 2147549183
print(convert_ipv4_to_int("1#0#0#0"))        # 16777216
print(convert_ipv4_to_int("129#0#0#0"))      # invalid IP
C++
#include <iostream>
#include <string>
#include <vector>
#include <sstream>

using namespace std;

string convertIPv4ToInt(const string& ip) {
    vector<string> parts;
    stringstream ss(ip);
    string part;

    while (getline(ss, part, '#')) {
        parts.push_back(part);
    }

    if (parts.size() != 4) {
        return "invalid IP";
    }

    try {
        int first = stoi(parts[0]);
        int second = stoi(parts[1]);
        int third = stoi(parts[2]);
        int fourth = stoi(parts[3]);

        if (first < 1 || first > 128 || second < 0 || second > 255 || third < 0 || third > 255 || fourth < 0 || fourth > 255) {
            return "invalid IP";
        }

        long result = ((long)first << 24) | (second << 16) | (third << 8) | fourth;
        return to_string(result);
    } catch (invalid_argument&) {
        return "invalid IP";
    }
}

int main() {
    string ip1 = "128#0#255#255";
    cout << convertIPv4ToInt(ip1) << endl; // 2147549183

    string ip2 = "1#0#0#0";
    cout << convertIPv4ToInt(ip2) << endl; // 16777216

    string ip3 = "129#0#0#0";
    cout << convertIPv4ToInt(ip3) << endl; // invalid IP

    return 0;
}
JavaScript
function convertIPv4ToInt(ip) {
    const parts = ip.split('#');
    if (parts.length !== 4) {
        return "invalid IP";
    }

    try {
        const first = parseInt(parts[0], 10);
        const second = parseInt(parts[1], 10);
        const third = parseInt(parts[2], 10);
        const fourth = parseInt(parts[3], 10);

        if (isNaN(first) || isNaN(second) || isNaN(third) || isNaN(fourth) ||
            first < 1 || first > 128 || second < 0 || second > 255 || third < 0 || third > 255 || fourth < 0 || fourth > 255) {
            return "invalid IP";
        }

        const result = (first << 24) | (second << 16) | (third << 8) | fourth;
        return result.toString();
    } catch (e) {
        return "invalid IP";
    }
}

// Test cases
console.log(convertIPv4ToInt("128#0#255#255")); // 2147549183
console.log(convertIPv4ToInt("1#0#0#0"));       // 16777216
console.log(convertIPv4ToInt("129#0#0#0"));     // invalid IP

复杂度分析

  • 时间复杂度: O(1),因为输入字符串的长度是固定的,且处理步骤是常数时间。
  • 空间复杂度: O(1),只使用了常数空间来存储中间结果。

总结

通过验证输入格式和每小节的范围,我们可以将合法的虚拟 IPv4 地址转换为 32 位整数。对于非法输入,返回 invalid IP。不同语言的实现方式略有不同,但核心思路一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝白咖啡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值