华为OD机试题【IPv4地址转换成整数】【2023 B卷 100分】

文章介绍了如何将一种特殊的虚拟IPv4地址转换成32位整数,涉及的编程语言包括Python、Java和C。题目要求验证地址合法性并进行转换,不合法的地址返回invalidIP。提供的代码示例展示了验证和转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述


🎯 前言

🏆 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最新试题。

🏆 华为机试有三道题,第一道和第二道属于简单题,分值为100分,第三道为困难题,分值为200分,总分400分,150分钟考试时间。

🏆 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!

🎯 题目描述

存在一种虚拟IPv4地址,由4小节组成,第一节节的范围为1-128,之后范围是0-255,以#号间隔,格式如下:(1-128)#(0-255)#(0-255)#(0-255)

请利用这个特性把虚拟IPv4地址转换为一个32位的整数,IPv4地址以字符串形式给出,要求每个IPvV4地址只能对应到唯一的整数上。

如果是非法IPv4,返回invalid IP。

输入描述:
输入一行,虚拟IPv4地址格式字符串

输出描述:
输出一行,按照要求输出整型或者特定字符

🎯 解题思路

对于一个给定的虚拟IPv4地址,可以通过以下步骤将其转换为32位整数:

  1. 首先,将IP地址按照#号进行拆分,得到四个小节的字符串。
  2. 对于每一节的字符串,先将其转换为整数。如果转换失败,说明该地址非法。
  3. 对于第一节字符串,需要检查其取值范围是否在1-128之间。如果不在,说明该地址非法。
  4. 对于剩下的三节字符串,需要检查其取值范围是否在0-255之间。如果不在,说明该地址非法。
  5. 如果全部验证通过,则将四个整数依次左移24、16、8、0位,并进行位或操作。得到的结果就是32位整数表示的IPv4地址。

示例 1

输入:
100#101#1#5

输出:
1684340997

示例 2

输入:
1#2#3

输出:
invalid IP

📙 Python代码实现

ip_str = input().strip()
ip_list = ip_str.split("#")
if len(ip_list) != 4:
    print("invalid IP")
else:
    try:
        a, b, c, d = map(int, ip_list)
        if not(1 <= a <= 128 and 0 <= b <= 255 and 0 <= c <= 255 and 0 <= d <= 255):
            print("invalid IP")
        else:
            ip_int = (a << 24) | (b << 16) | (c << 8) | d
            print(ip_int)
    except ValueError:
        print("invalid IP")

📗 Java代码实现

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String ipStr = scanner.nextLine().trim();
        String[] ipList = ipStr.split("#");
        if (ipList.length != 4) {
            System.out.println("invalid IP");
        } else {
            try {
                int a = Integer.parseInt(ipList[0]);
                int b = Integer.parseInt(ipList[1]);
                int c = Integer.parseInt(ipList[2]);
                int d = Integer.parseInt(ipList[3]);
                if (!(1 <= a && a <= 128 && 0 <= b && b <= 255 && 0 <= c && c <= 255 && 0 <= d && d <= 255)) {
                    System.out.println("invalid IP");
                } else {
                    int ipInt = (a << 24) | (b << 16) | (c << 8) | d;
                    System.out.println(ipInt);
                }
            } catch (NumberFormatException e) {
                System.out.println("invalid IP");
            }
        }
    }
}

📘 C语言代码实现

#include
#include

int main() {
    char ipStr[20];
    fgets(ipStr, 20, stdin);
    char * ipList[4];
    char * ptr = strtok(ipStr, "#");
    int i = 0;
    while (ptr != NULL) {
        ipList[i++] = ptr;
        ptr = strtok(NULL, "#");
    }
    if (i != 4) {
        printf("invalid IP\n");
        return 0;
    }
    int a, b, c, d;
    if (sscanf(ipList[0], "%d", & a) != 1 || sscanf(ipList[1], "%d", & b) != 1 || sscanf(ipList[2], "%d", & c) != 1 || sscanf(ipList[3], "%d", & d) != 1) {
        printf("invalid IP\n");
    } else if (!(1 <= a && a <= 128 && 0 <= b && b <= 255 && 0 <= c && c <= 255 && 0 <= d && d <= 255)) {
        printf("invalid IP\n");
    } else {
        int ipInt = (a << 24) | (b << 16) | (c << 8) | d;
        printf("%d\n", ipInt);
    }
    return 0;
}

在这里插入图片描述

📭 本专栏包含了最新最全的2023年 华为OD机试真题,有详细的分析和解答。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不太灵光的程序员

有用的话可以请博主喝杯咖啡续命

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

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

打赏作者

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

抵扣说明:

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

余额充值