题解 | #识别有效的IP地址和掩码并进行分类统计#c++,利用bitset进行求解。

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

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

#include <iostream>
#include <bitset>
#include <string>
#include <vector>

using namespace std;

bool isIgnore(vector<string> ip) {
    if (ip[0].compare("0") == 0 || ip[0].compare("127") == 0){
        return true;
    }
    
    return false;
}

bool isIpValid(vector<string> ip) {
    
    for(int i=0;i<int(ip.size());i++){
        
        // 不包含数字的情况 19..0
        if(ip[i].size() == 0){
            return false;
        }
        
        //大于256 或 小于0
        if(stoi(ip[i]) >= 256 || stoi(ip[i]) < 0){
            return false;
        }
        
    }
    return true;
}

bool isMaskValid(vector<string> mask){
    string s;
    
    for(int i=0;i<mask.size();i++){
       s.append((bitset<8>(stoi(mask[i]))).to_string());
    }
    
//     mask的判断规则为:先取Not,再加一,再取and
    bitset<32> bit1(s);
    if(bit1.count() == 32 || bit1.count() == 0){
        return false;
    }
    bitset<32> bit2((~bit1).to_ulong()+1);
    if(((~bit1)&bit2).to_ulong() != 0){
        return false;
    }
    
    return true;
    
}
    

int main(void) {

    string ipAddress;  //接受输入的ip地址字符串
    string maskCode;  //接受输入的子网掩码字符串
    vector<string> ip;  //ip地址数组(4),每个值都为bit形式
    vector<string> mask; //mask地址数组(4),每个值都为bit形式
    string input;
    vector<int> result(7,0);
    int start;
    int count = 0;
//     bitset<32> ip;
//     bitset<32> code;
    while (cin >> input) {
        ip.clear();
        mask.clear();
        int index = input.rfind('~');
        ipAddress = input.substr(0, index);
        maskCode = input.substr(index + 1);
        ipAddress.push_back('.');
        maskCode.push_back('.');
        
        //读取并保存ip
        start = 0;
        for (int i = 0; i < ipAddress.size(); i++) {
            if (ipAddress[i] == '.') {
//                 bitset<8> bit(stoi(ipAddress.substr(start, i - start)));
                ip.push_back(ipAddress.substr(start, i - start));
                start = i + 1;
            }
        }
        
        //读取并保存mask
        start = 0;
        for (int i = 0; i < maskCode.size(); i++) {
            if (maskCode[i] == '.') {
//                 bitset<8> bit(stoi(ipAddress.substr(start, i - start)));
                mask.push_back(maskCode.substr(start, i - start));
                start = i + 1;
            }
        }
        
        if(isIgnore(ip)){
            continue;
        }
        
        if(!isMaskValid(mask) || !isIpValid(ip)){
            result[5]++;
        }
        else{
            if(stoi(ip[0])>=1 && stoi(ip[0])<=126){
                result[0]++;
            }
            else if(stoi(ip[0])>=128 && stoi(ip[0])<=191){
                result[1]++;
            }
            else if(stoi(ip[0])>=192 && stoi(ip[0])<=223){
                result[2]++;
            }
            else if(stoi(ip[0])>=224 && stoi(ip[0])<=239){
                result[3]++;
            }
            else if(stoi(ip[0])>=240 && stoi(ip[0])<=255){
                result[4]++;
            }
            
            if(stoi(ip[0])==10){
                result[6]++;
            }
            
            if(stoi(ip[0])==172 && stoi(ip[1])>=16 && stoi(ip[1])<=31){
                result[6]++;
            }
            
            if(stoi(ip[0])==192 && stoi(ip[1])==168){
                result[6]++;
            }
            
        }
       
        
       
        
    }
    
    for(int j=0;j<result.size();j++){
        cout<< result[j]<<" ";
    }

    return 0;
}
全部评论

相关推荐

DKS233:(1)专业技能:Java8也太旧了,最少也要了解到JDK17吧,可以参考现在SpringBoot支持的Java最低版本,熟悉mysql基本理论具体指啥,是锁这种具体原理还是分库分表这些业务场景,spring这些专业词汇,大小写要写对(全篇简历都有这个问题,显得不严谨),熟悉使用框架进行业务开发就别写了,如果要写,起码要写到框架原理部分吧,比如aop,启动原理什么的,springcloud具体指哪些模块呢,写清楚,网关还是鉴权还是什么,“改造”没必要写吧,你直接说用springcloud开发的不就行了(2)项目经历:首先格式就有大问题,时间怎么能换行呢,调整一下,响应速度那个,如果指的是将部分数据从其他数据库转到redis的提升就别写了,因为这个不算难点,redis可以写写分布式这些,比如容灾怎么实现的,数据库同步怎么做的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
08-08 17:00
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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