!!!题解 | 验证IP地址 这道题的细节以及思路非常值得学习 以及对分支的划分
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
class Solution {
public:
//将字符串从.或者:分割开
vector<string> split(string s, string spliter) {
vector<string> res;
int i;
//遍历字符串查找spliter
//****************************这段代码写得真漂亮
while((i = s.find(spliter)) && i != s.npos){
//将分割的部分加入vector中
res.push_back(s.substr(0, i));
s = s.substr(i + 1);
/*s.substr(pos, len)
返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)*/
}
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 c >= '0' && c <= '9';
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, ":");
//IPv6必定为8组
if(s.size() != 8)
return false;
for(int i = 0; i < s.size(); i++){
//每个分割不能缺省,不能超过4位
if(s[i].size() == 0 || s[i].size() > 4)
return false;
for(int j = 0; j < s[i].size(); j++){
//不能出现a-fA-F以外的大小写字符
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";
}
};
// #include <ios>
// #include <string>
// class Solution {
// public:
// /**
// * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
// *
// * 验证IP地址
// * @param IP string字符串 一个IP地址字符串
// * @return string字符串
// */
// string solve(string IP) {
// // write code here
// //根据位数判断是v6 v6主要从位数来判断
// //不是v6就是v4.v4的话 一是看一段小于255,二是有没有前导0
// if(IP.size()==0)return "Neither";
// int spllit=identify(IP);
// //if(spllit==3)return "Neither";
// if(spllit==0)if(isipv4(IP))return "IPv4";
// if(spllit==1)if(isipv6(IP))return "IPv6";
// return "Neither";
// }
// int identify(string& IP){
// int segnum=0;
// int size=IP.size();
// for(int i=0;i<size;i++){
// while((IP[i]!='.')||()IP[i]!='.'&&i<size){
// i++;
// }
// //此时i为.
// segnum++;
// }
// if(segnum==4)return 0;
// else if(segnum==8)return 1;
// else return 3;
// // int segnum=0;
// // int size=IP.size();
// // for(int i=0;i<size;i++){
// // if(IP[i]=='.')
// // //此时i为.
// // segnum++;
// // }
// // if(segnum==3)return 0;
// // else if(segnum==7)return 1;
// // else return 3;
// };//这段可以换成数.的个数
// bool isipv4(string& IP){
// int size=IP.size();
// for(int i=0;i<size;i++){
// int left=i;
// while(IP[i]!='.'&&i<size){
// i++;
// }
// int right=i-1;
// if(IP[left]=='0'&&right!=left)return false;
// int num=0;
// for(int j=left;j<=right;j++){
// num=num*10+(IP[j]-'0');//细节1
// }
// if(num>255)return false;
// }
// return true;
// };
// bool isipv6(string& IP){
// int size=IP.size();
// for(int i=0;i<size;i++){
// int left=i;
// while(IP[i]!='.'&&i<size){
// i++;
// }
// int right=i-1;
// if((right-left+1)!=4)return false;
// for(int j=left;j<=right;j++){
// char c=IP[j];
// if((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') );
// else return false;
// }
// }
// return true;
// }
// };
