题目描述
存在一种虚拟 IPv4 地址 Q,由 4 小节组成,每节的范围为 0~255,以 #
号间隔。虚拟 IPv4 地址可以转换为一个 32 位的整数。例如:
128#0#255#255
转换为 32 位整数的结果为2147549183
(0x8000FFFF
)1#0#0#0
转换为 32 位整数的结果为16777216
(0x01000000
)
现以字符串 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
解题思路
- 验证输入格式: 检查输入字符串是否包含 4 个小节,且每小节之间用
#
分隔。 - 验证每小节范围: 检查每小节的值是否在合法范围内(第 1 小节为 1~128,其余小节为 0~255)。
- 转换为整数: 将合法的 IPv4 地址转换为 32 位整数。
- 处理非法输入: 如果输入不合法,返回
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
。不同语言的实现方式略有不同,但核心思路一致。