leetcode-验证IP地址

点击:题目链接:编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
如果是有效的 IPv4 地址,返回 “IPv4” ;
如果是有效的 IPv6 地址,返回 “IPv6” ;
如果不是上述类型的 IP 地址,返回 “Neither” 。
IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如,2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

思路

处理字符串的题目。需要额外地注意多种边界情况。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
class Solution {
public:
string validIPAddress(string IP) {

int space = 0;
while (space != IP.npos) {
space = IP.find(" ");
if (space != IP.npos) IP.erase(space, 1);
}
if (IP.empty()) return "Neither";
if (IP[IP.size() - 1] == '.' || IP[IP.size() - 1] == ':') return "Neither";

if (isIPV4(IP)) {
return "IPv4";
}

if (isIPV6(IP)) {
return "IPv6";
}

return "Neither";
}

bool isIPV4(string IP) {
int count = 0;

while (!IP.empty()) {
++count;
int index = IP.find(".");
string temp;
if (index == -1) {
temp = IP;
IP.erase(0, temp.size());

}
else {
temp = IP.substr(0, index);
IP.erase(0, index + 1);
}

if ((temp.size()!= 1 && temp[0] == '0')|| temp.size()>3) return false;

if (temp == "") return false;

for (auto a : temp) {
if (!(a >= '0' && a <= '9') ) return false;
}

if (!(stoi(temp) >= 0 && stoi(temp) <= 255)) return false;

}

if (count != 4) return false;

return true;
}

bool isIPV6(string IP) {
int count = 0;

while (!IP.empty()) {
++count;
int index = IP.find(":");

string temp;
if (index == IP.npos) {
temp = IP;
IP.erase(0, temp.size());
}
else {
temp = IP.substr(0, index);
IP.erase(0, index + 1);
}

if (temp.size() > 4 || temp == "") return false;

for (auto a : temp) {
if (!((a <= 'f' && a >= 'a') || (a <= 'F' && a >= 'A') || (a <= '9' && a >= '0'))) {
return false;
}
}
}

if (count != 8) return false;
return true;
}
};

思路

可以直接使用正则表达式,方便快捷

代码

1
//待更新
作者

Dylan Zhu

发布于

2021-04-10

更新于

2021-04-10

许可协议

评论

:D 一言句子获取中...