!!!题解 | 验证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;
        
//     }
// };

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务