题解 | 合法IP

合法IP

https://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

bool range(int a){
    return a >= 0 && a <= 255;
}

bool seqi(string s, int i){ // string equal to int
    if(to_string(i) == s)
        return true;
    return false;
}

bool check(string& s){
    // 排除非数字和.的问题
    int dotcnt = 0;
    for(auto elem : s){
        if(elem == '.'){
            dotcnt++;
        }
        else if(!(elem >= '0' && elem <= '9')){
            return false;
        }
    }
    // .个数不为3,那么格式一定是错的
    if(dotcnt != 3) {
        return false;
    }
    // 判断三个.是否处在正确的位置
    if(s[0] == '.'){
        return false;
    }
    // 第一个字符一定是数字
    for(int i = 2; i < s.length(); ++i){
        if(s[i] == '.' && s[i-1] == '.'){
            return false;
        }
    }
    // .之间一定隔着数字
    // 且三个.隔开了四个数字
    // 再判断数字的问题
    for(auto& elem : s)
        if(elem == '.')
            elem = ' ';
    string s1,s2;
    s1 = s2 = s;
    istringstream iss(s1);
    istringstream iss2(s2);
    string sn1,sn2,sn3,sn4;
    int n1,n2,n3,n4;
    iss >> sn1 >> sn2 >> sn3 >> sn4;
    iss.str(s2);
    iss2 >> n1 >> n2 >> n3 >> n4;
    if(!seqi(sn1,n1) || !seqi(sn2,n2) || !seqi(sn3,n3) || !seqi(sn4,n4))
        return false;
    if(range(n1) && range(n2) && range(n3) && range(n4))
        return true;
    return false;
}


int main()
{
    string s;
    while(cin >> s){
        if(!check(s))  // 非法ip
            cout << "NO" << endl;
        else
            cout << "YES" << endl;
    }

    return 0;
}



全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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