题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

#include <cctype>
#include <exception>
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
vector<int> shift(const string& s) {
    vector<int> v(4);
    int l = 0, idx = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '.') {
            v[idx++] = stoi(s.substr(l, i - l));
            l = i + 1;
        }
        v[idx] = stoi(s.substr(l, s.size() - l)); //使用stoi切记其没有合法性检验,会直接抛异常
    }
    return v;
}
bool isValid(vector<int>& v) {
    for (int num : v) {
        if (num < 0 || num > 255) return false;
    }
    return true;
}
void judgeKind(int m, vector<int>& kind) {
    if (m >= 1 && m <= 126) ++kind[0];
    else if (m >= 128 && m <= 191) ++kind[1];
    else if (m >= 192 && m <= 223) ++kind[2];
    else if (m >= 224 && m <= 239) ++kind[3];
    else if (m >= 240 && m <= 255) ++kind[4];
}
bool isPirv(int m, int n) {
    bool b = false;
    if (m == 10) b = true;
    else if (m == 172 && n >= 16 && n <= 31) b = true;
    else if (m == 192 && n == 168) b = true;
    return b;
}
bool isValidMask(vector<int>& mask) {
    if (!isValid(mask)) return false;
    vector<int> temp;
    for (int num : mask) {
        bitset<8> bits(num);
        for (int i = 7; i >= 0; i--) temp.push_back(bits[i]);
    }
    if (temp.front() == 0 || temp.back() == 1) return false;
    int idx = 0;
    while (idx < temp.size() && temp[idx] == 1) ++idx;
    while (idx < temp.size()) {
        if (temp[idx] == 1) return false;
        else ++idx;
    }
    return true;
}
int main() {
    vector<int> kind(5, 0); //ABCDE
    int err = 0, priv = 0;
    string s;
    while (cin >> s) {
        string sIp = s.substr(0, s.find('~')), sMask = s.substr(s.find('~') + 1);
        vector<int> ip, mask;
        try {
            ip = shift(sIp);
        } catch (exception) {
            ip = {-1, 0, 0, 0};
        }
        try {
            mask = shift(sMask);
        } catch (exception) {
            mask = {-1, 0, 0, 0};
        }
        if (ip[0] == 0 || ip[0] == 127) continue;
        if (!isValid(ip) || !isValidMask(mask)) ++err;
        else {
            judgeKind(ip[0], kind);
            if (isPirv(ip[0], ip[1])) ++priv;
        }
    }
    for (int i = 0; i < 5; i++) cout << kind[i] << " ";
    cout << err << " " << priv;
}

全部评论

相关推荐

神哥了不得:你简历字体有点不太协调呀,下面的字实在太小了呀,而且项目也不太行,建议换几个高质量的项目,面试会多很多
点赞 评论 收藏
分享
02-23 00:10
湖南大学 C++
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务