题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
#include <string>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return stiring字符串
*/
vector<string> split(string s, string spliter) {
vector<string> res;
int i;
while ((i = s.find(spliter)) && i != s.npos) {
res.push_back(s.substr(0, i));
s = s.substr(i + 1);
}
res.push_back(s);
return res;
}
bool isIPv4 (string IP) {
vector<string> s = split(IP, ".");
//IPv4必定为4组
if(s.size() != 4)
return false;
for(int i = 0; i < s.size(); i++){
//不可缺省,有一个分割为零,说明两个点相连
if (s[i].size() == 0)
return false;
//比较数字位数及不为零时不能有前缀零
if (s[i].size() < 0 || s[i].size() > 3 || (s[i][0]=='0' && s[i].size() != 1))
return false;
//遍历每个分割字符串,必须为数字
for (int j = 0; j < s[i].size(); j++)
if (!isdigit(s[i][j]))
return false;
//转化为数字比较,0-255之间
int num = stoi(s[i]);
if (num < 0 || num > 255)
return false;
}
return true;
}
bool isIPv6(string IP) {
vector<string> s = split(IP, ":");
if (s.size() != 8) return false;
for (int i = 0; i < s.size(); i++) {
if (s[i].size() == 0 || s[i].size() > 4)
return false;
for(int j = 0; j < s[i].size(); j++){
if (!(isdigit(s[i][j]) || (s[i][j] >= 'a' && s[i][j] <= 'f') ||
(s[i][j] >= 'A' && s[i][j] <= 'F')))
return false;
}
}
return true;
}
string solve(string IP) {
if (IP.size() == 0)
return "Neither";
if (isIPv4(IP))
return "IPv4";
else if (isIPv6(IP))
return "IPv6";
return "Neither";
}
};