题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
class Solution {
public:
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string nth = "Neither";
string v4 = "IPv4";
string v6 = "IPv6";
bool isLegal(string str, int mode) {
bool leg = false;
switch (mode) {
case 4:
if (str.size() > 1 && str[0] == '0')
leg = false;
else if (stoi(str) > 255 || stoi(str) < 0)
leg = false;
else {
for (auto i : str)
if (!(i >= '0' && i <= '9'))
return false;
leg = true;
}
break;
case 6:
if (str.size() > 4)
leg = false;
else {
for (auto i : str)
if (!((i >= '0' && i <= '9') || (i >= 'a' && i <= 'f') || (i >= 'A' && i <= 'F')))
return false;
leg = true;
}
break;
default:
break;
}
return leg;
}
string cal4Or6(string s, vector<int>& ilist, int n, int calV4Or6) {
if (ilist.size() != n)
return nth;
int index = 0;
vector<string> strVc;
for (int i = 0; i < ilist.size(); i++) {
if (i < ilist.size() - 1)
if ((ilist[i + 1] - ilist[i]) == 1)
return nth;
strVc.push_back(s.substr(index, ilist[i] - index));
index = ilist[i] + 1;
}
strVc.push_back(s.substr(index, ilist.size() - index));
for (auto i : strVc) {
if (!isLegal(i, calV4Or6))
return nth;
}
return calV4Or6 == 4 ? v4 : v6;
}
string solve(string IP) {
string s = nth;
if (IP.length() < 7)
return s;
int i = 0;
bool isv4 = false;
bool isv6 = false;
vector<int> ilist;
while (i < IP.length()) {
if (IP[i] == ':' || IP[i] == '.') {
if (IP[i] == '.')
isv4 = true;
else
isv6 = true;
ilist.push_back(i);
}
i++;
}
if (isv4)
s = cal4Or6(IP, ilist, 3, 4); // 3个.
else if (isv6)
s = cal4Or6(IP, ilist, 7, 6); // 7个:
return s;
}
};
