题解 | #识别有效的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;
}

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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