文章目录
- 🎯 前言
- 🎯 题目描述
- 🎯 解题思路
- 示例 1
- 示例 2
- 📙 Python代码实现
- 📗 Java代码实现
- 📘 C语言代码实现
🎯 前言
🏆 《华为机试真题》专栏含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位整数:
- 首先,将IP地址按照#号进行拆分,得到四个小节的字符串。
- 对于每一节的字符串,先将其转换为整数。如果转换失败,说明该地址非法。
- 对于第一节字符串,需要检查其取值范围是否在1-128之间。如果不在,说明该地址非法。
- 对于剩下的三节字符串,需要检查其取值范围是否在0-255之间。如果不在,说明该地址非法。
- 如果全部验证通过,则将四个整数依次左移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机试真题,有详细的分析和解答。