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

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

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

#include <iostream>
#include <string>
#include <vector>
#include <bitset>
using namespace std;

int main() {
    string str,str1,str2,str3,str4;
    int pos;
    vector<int> num1,num2;
    int cout_a=0,cout_b=0,cout_c=0,cout_d=0,cout_e=0,cout_err=0,cout_err_now=0,cout_private=0;
    while (getline(cin,str)) { // 注意 while 处理多个 case
        pos=str.find('~');
        str1.append(str,0,pos);
        str2.append(str,pos+1,str.size()-1);

        for(int i=0;i<str1.size();i++){
            if(str1[i]!='.'){
                str3+=str1[i];
            }
            else if(str1[i]=='.'&&str3!=""){  //处理19..0.
                num1.push_back(stoi(str3));
                str3="";
            }
        }
        if(str3!="") num1.push_back(stoi(str3));//添加ip地址最后一位
        str1="";
        str3="";

        for(int j=0;j<str2.size();j++){
            if(str2[j]!='.'){
                str4+=str2[j];
            }
            else if(str2[j]=='.'&&str4!=""){  //处理19..0.
                num2.push_back(stoi(str4));
                str4="";
            }
        }
        if(str4!="") num2.push_back(stoi(str4));//添加ip地址最后一位
        str2="";
        str4="";
        
        
//判断子网掩码
        if(num2.size()==4){
            bitset<8> bits1(num2[0]);
            bitset<8> bits2(num2[1]);
            bitset<8> bits3(num2[2]);
            bitset<8> bits4(num2[3]);
            string str_1=bits1.to_string();
            string str_2=bits2.to_string();
            string str_3=bits3.to_string();
            string str_4=bits4.to_string();
            string str_5=str_1+str_2+str_3+str_4;
            int pos=str_5.find("01");
            if(pos!=-1 || \
               (num2[0]==255&&num2[1]==255&&num2[2]==255&&num2[3]==255) || \
               (num2[0]==0  &&num2[1]==0  &&num2[2]==0  &&num2[3]==0) ){//如果找到01
                cout_err_now=1;//cout_err_now代表本次子网掩码是否错误
            }
        }

//判断a~e 有效ip
        if(num1.size()==4 && cout_err_now==0 && \
            num1[0]>=1&&num1[0]<=126 && \
            num1[1]>=0&&num1[1]<=255 && \
            num1[2]>=0&&num1[2]<=255 && \
            num1[3]>=0&&num1[3]<=255 ){
            
            cout_a++;
        }
        else if(num1.size()==4 && cout_err_now==0 && \
            num1[0]>=128&&num1[0]<=191 && \
            num1[1]>=0&&num1[1]<=255 && \
            num1[2]>=0&&num1[2]<=255 && \
            num1[3]>=0&&num1[3]<=255 ){
            cout_b++;
        }
        else if(num1.size()==4 && cout_err_now==0 && \
            num1[0]>=192&&num1[0]<=223 && \
            num1[1]>=0&&num1[1]<=255 && \
            num1[2]>=0&&num1[2]<=255 && \
            num1[3]>=0&&num1[3]<=255 ){
            cout_c++;
        }       
        else if(num1.size()==4 && cout_err_now==0 && \
            num1[0]>=224&&num1[0]<=239 && \
            num1[1]>=0&&num1[1]<=255 && \
            num1[2]>=0&&num1[2]<=255 && \
            num1[3]>=0&&num1[3]<=255 ){
            cout_d++;
        }
        else if(num1.size()==4 && cout_err_now==0 && \
            num1[0]>=240&&num1[0]<=255 && \
            num1[1]>=0&&num1[1]<=255 && \
            num1[2]>=0&&num1[2]<=255 && \
            num1[3]>=0&&num1[3]<=255 ){
            cout_e++;
        }
        else if(num1[0]==0 || num1[0]==127 ){//注意这里一定不能加num1.size()==4 && cout_err_now==0 因为这个不在计数范围内
            
        }
        else{
            cout_err++;
        }

//判断私有ip
        if(num1.size()==4 && cout_err_now==0 && \
            (num1[0]==10 && \
             num1[1]>=0 && num1[1]<=255 && \
             num1[2]>=0 && num1[2]<=255 && \
             num1[3]>=0 && num1[3]<=255)|| \
            (num1[0]==172 && \
             num1[1]>=16 && num1[1]<=31 && \
             num1[2]>=0  && num1[2]<=255 && \
             num1[3]>=0  && num1[3]<=255)|| \                                       
            (num1[0]==192 && \
             num1[1]==168 && \
             num1[2]>=0  && num1[2]<=255 && \
             num1[3]>=0  && num1[3]<=255) ){       
            cout_private++;
        }

        num1={};
        num2={};
        cout_err_now=0;//本次的判断完,cout_err_now清零

    }
    cout<< cout_a <<" "<< cout_b<<" "<<cout_c<<" "<<cout_d<<" "<<cout_e<<" "<<cout_err<<" "<<cout_private<<endl;
}
// 64 位输出请用 printf("%lld")

解题思路:

关于输入输出:输入为一行字符串,可以直接用getline(cin,str)

关于判断ip类型:先把字符串的ip和子网掩码分开,利用find('~')即可。然后把ip的每个.隔开的字符串变成int,利用stoi(str),用vector保存每部分的数,然后比较其范围。

关于判断子网掩码类型:同理把每个.隔开的字符串变成int,然后根据子网掩码的特点,前面是连续1后面连续0,需要把int转化成二进制,可以利用bitset<8> bits(n),然后把二进制转成字符串,利用bits.to_string(),最后搜索里面有没有“01”出现。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
07-07 12:47
门头沟学院 Java
码农索隆:竟然还真有卡体检报告的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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