点击:题目链接:编写一个函数来验证输入的字符串是否是有效的 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; } };
|
思路
可以直接使用正则表达式,方便快捷
代码