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

#include <iostream>
#include <array>
using namespace std;

bool ParseIP(string str, array<int, 4>& ip)
{
    for (int i = 0; i < 4; i++)
    {
        int pos = str.find('.');
        string sub = str.substr(0, pos);
        if (sub.empty())
            return false;
        ip[i] = stoi(sub);
        str = str.substr(pos + 1);
    }
    return true;
}
bool ParseString(string str, array<int, 4>& ip, array<int, 4>& mask)
{
    int pos = str.find('~');
    if (pos == -1)
        return false;
    if (!ParseIP(str.substr(0, pos), ip))
        return false;    
    if (!ParseIP(str.substr(pos + 1), mask))
        return false;
    return true;   
}
const array<int, 7> s_mask = {128, 128+64, 128+64+32, 128+64+32+16, 128+64+32+16+8, 128+64+32+16+8+4, 128+64+32+16+8+4+2}; 
bool CheckMask(array<int, 4>& mask)
{
    bool one = false, zero = false;
    for (int i = 0; i < 4; i++)
    {
        if (mask[i] == 255)
        {
            if (zero)
                return false;
            if (!one)
                one = true;
            continue;
        }
        if (mask[i] == 0)
        {
            if (!one)
                return false;
            if (!zero)
                zero = true;
            continue;
        }
        bool find = false;
        for (int a: s_mask)
        {
            if (a == mask[i])
            {
                find = true;
                break;
            }
        }
        if (!find)
            return false;
        one = true;
        if (zero)
            return false;
        zero = true;
    }
    return one && zero;
}

int main() {
    string str;
    int a = 0, b = 0, c = 0, d = 0, e = 0, err = 0, pri = 0;
    while (cin >> str) 
    {
        array<int, 4> ip, mask;
        if (str.find("0.") == 0 || str.find("127.") == 0)
            continue;
        if (!ParseString(str, ip, mask))
        {
            err++;
            continue;
        }
        if (!CheckMask(mask))
        {
            err++;
            continue;
        }
        if (ip[0] >= 1 && ip[0] <= 126)
            a++;
        else if (ip[0] <= 191)
            b++;
        else if (ip[0] <= 223)
            c++;
        else if (ip[0] <= 239)
            d++;
        else
            e++;
        if (ip[0] == 10 || (ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31) || (ip[0] == 192 && ip[1] == 168))
            pri++;

    }
    printf ("%d %d %d %d %d %d %d\n", a, b, c, d, e, err, pri);
}
// 64 位输出请用 printf("%lld")

亮点在CheckMask的部分哦,判断是否有1,是否有0,是否存在0在1前

全部评论

相关推荐

#实习生##百度##大模型#(至少26届)百度-智慧城市-北京-测试开发实习生。&nbsp;&nbsp;音频、视频算法背景最佳,其他要求如下:1、开源大模型部署、使用经验,例如文生图、文本、视觉等(stable&nbsp;diffusion/llava/gpt/阿里Qwen/商汤internVL等等)2、传统视觉模型部署、测试经验优先(yolo系列等等),对于模型测试集有扩充、筛选经验优先工作职责-负责需求分析、测试用例设计、功能测试、性能&amp;压力测试、稳定性测试、高可用测试以及跨产品的联调测试等-负责Web端、服务端相关测试,CI/CD流水线建设和优化、监控体系建设和优化-协助研发定位问题,并对产品及流程提出持续性改进建议-负责根据各项规范推进项目如期上线&nbsp;,迭代结束后归纳总结经验教训职责要求-计算机相关专业,本科及以上学历;-能熟练地应用以下一门或几门技术进行相关开发:C/C++/Java/object-c/goland、Linux/Unix&nbsp;Shell、Perl/Python/PHP、JavaScript/Html/Ajax-熟悉云原生架构及原理、熟悉K8S和Docker相关技术者优先-有测试实习经验者优先-具备快速的产品及业务学习能力,敏捷全面的逻辑思维能力-对软件测试有浓厚的兴趣,有很强的分析,问题定位能力和项目推动能力-具有良好的沟通协调能力、较强的团队合作精神、优秀的执行能力-热爱互联网,对互联网相关业务或技术充满好奇及热情
投递百度等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务