题解 | #识别有效的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;
}
 查看7道真题和解析
查看7道真题和解析
