题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880?tpId=295&tqId=1024725&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
真的这道题写吐了我
class Solution {
public:
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
if (IP.empty()) {
return "Neither";
}
split(IP);
if (is_ipv4()) {
return "IPv4";
} else if (is_ipv6()) {
return "IPv6";
} else {
return "Neither";
}
}
private:
void split(const std::string &s) {
int i = 0;
std::string tmp;
while (i < s.size()) {
int j = i;
while (j < s.size() && std::isalnum(s[j])) {
tmp += s[j];
++j;
}
res.push_back(tmp);
tmp.clear();
i = j + 1;
// 末尾分隔符 或者连续的分隔符
if (s[i] == ':' || s[i] == '.' || i == s.size() && !std::isalnum(s[j])) {
res.push_back("-1");
++i;
}
}
}
bool is_ipv4() {
if (res.size() != 4) {
return false;
}
for (int i = 0; i < res.size(); ++i) {
// 位数限制
if (res[i].empty() || res[i].size() > 3) {
return false;
}
// 内容限制
for (int j = 0; j < res[i].size(); ++j) {
if (!std::isdigit(res[i][j]) || res[i][0] == '0' && res[i].size() != 1) {
return false;
}
}
// 大小限制
if (std::stoi(res[i]) < 0 || std::stoi(res[i]) >255) {
return false;
}
}
return true;
}
bool is_ipv6() {
if (res.size() != 8) {
return false;
}
for (int i = 0; i < res.size(); ++i) {
// 位数限制
if (res[i].empty() || res[i].size() > 4) {
return false;
}
// 大小限制
for (int j = 0; j < res[i].size(); ++j) {
if (!(std::isdigit(res[i][j]) || res[i][j] <= 'f' && res[i][j] >= 'a' || res[i][j] >= 'A' && res[i][j] <= 'F')) {
return false;
}
}
}
return true;
}
private:
std::vector<std::string> res;
};