题解 | #判断两个IP是否属于同一子网#

判断两个IP是否属于同一子网

https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string& s, const string ®) 
{   //分割函数,分离ip中的"."
    vector<string> res;
    string token, str = s;
    size_t pos;
    while((pos = str.find(reg)) != string::npos){
        token = str.substr(0, pos);
        res.push_back(token);
        str = str.substr(pos + reg.size());
    }
    if(!str.empty()) res.push_back(str);
    return res;
}
vector<int> getNet(vector<string> &net) 
{
    vector<int> res;
    for(int i = 0; i < net.size(); ++i) {
        res.push_back(stoi(net[i]));
    }
    return res;
}
bool judgeNetLegal(vector<int> &net)
{
    if(net.size() != 4) return false;
    if(net[0] == 0) return false;
    for(int i = 0; i < 4; ++i) {
        if(net[i] > 0 && net[i] < 256) continue;
        return false;
    }
    return true;
}
string getBinaryString(int n) 
{
    string res = "";
    while(n > 0) {
        res.push_back(n % 2 + '0');
        n = n / 2;
    }
    while(res.size() < 8) res.push_back('0');
    reverse(res.begin(), res.end());
    return res;
}
bool judgeMarsk(vector<int> &marsk) 
{
    if(marsk.size() != 4) return false;
    string netBinary = "";
    for(int i = 0; i < 4; ++i) {
        if(marsk[i] < 0 || marsk[i] >= 256) return false;
        netBinary.append(getBinaryString(marsk[i]));
    }
    int i = 0;
    for(; i < netBinary.size(); ++i) {
        if(netBinary[i] == '0') break;
    }
    for(; i < netBinary.size(); ++i) {
        if(netBinary[i] == '1') return false;
    }
    return true;

}
int main() {
    string marsk;
    string net1;
    string net2;
    getline(cin, marsk);
    getline(cin, net1);
    getline(cin, net2);
    vector<string> vsmarsk = split(marsk, ".");
    vector<string> vsnet1 = split(net1, ".");
    vector<string> vsnet2 = split(net2, ".");
    vector<int> vimarsk = getNet(vsmarsk);
    vector<int> vinet1 = getNet(vsnet1);
    vector<int> vinet2 = getNet(vsnet2);
    if(judgeNetLegal(vinet1) && judgeNetLegal(vinet2) && judgeMarsk(vimarsk)) {
        vector<int> vi1;
        vector<int> vi2;
        for(int i = 0; i < 4; ++i) {
            if((vimarsk[i] & vinet1[i]) == (vimarsk[i] & vinet2[i])) continue;
            cout << 2;
            return 0;
        }
        cout << 0;
        return 0;
    }
    cout << 1;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务