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

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

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

注意问题:
1.掩码判断:利用数组将可能出现的数字列出来,以此判断。{0,128,192,224,240,248,252,254,255},不是这些数肯定有误;
2.掩码全为255或0记为有误,易忽略该情况;
3.私人ip地址值注意审题;
4.无效ip地址值的理解,只要以0或127开头直接记为无效,不与其他情况讨论;
5.此题主要是考察逻辑性,算法上无难度。
#include <stdio.h>
#include <string.h>

int trans_num(char str[],int a,int b)//str字符串a到b-1对应的数字
{
    int num=0,i;
    for(i=a;i<b;i++)
        if('0'<=str[i]&&str[i]<='9') num=num*10+str[i]-'0';
        else return -200;
    return num;
}

int jud_yanma(int yanma[])//判断是否符合掩码正常格式,符合返回0,否则返回1
{
    int i,j,num;
    for(i=0;i<4;i++)
        if(yanma[i]!=255) break;
    for(i=i+1;i<4;i++)
        if(yanma[i]!=0) return 1;
    return 0;
}

int all_255(int yanma[])
{
    int i,jud=1;
    for(i=0;i<4;i++)
        if(yanma[i]!=255)
        {
            jud=0;
            break;
        }
    return jud;
}

int all_0(int yanma[])
{
    int i,jud=1;
    for(i=0;i<4;i++)
        if(yanma[i]!=0)
        {
            jud=0;
            break;
        }
    return jud;
}

int main()
{
    int A=0,B=0,C=0,D=0,E=0,err=0,pri=0;
    char str[200];
    int length,i,j;
    int note[7],num[4],yanma[4];//六个'.'和一个'~'的标号,四个ip地址数字
    int jud[9]={0,128,192,224,240,248,252,254,255};
    while(gets(str)!=NULL)
    {
        int k=0;
        length=strlen(str);
        for(i=0;i<length;i++)
            if(str[i]=='.'||str[i]=='~') note[k++]=i;
        
        num[0]=trans_num(str, 0, note[0]);
        num[1]=trans_num(str, note[0]+1, note[1]);
        num[2]=trans_num(str, note[1]+1, note[2]);
        num[3]=trans_num(str, note[2]+1, note[3]);
        /*无效ip地址*/
        if(num[0]==0||num[0]==127)  continue;
        /*错误ip地址*/
        if((note[1]==note[0]+1)||(note[2]==note[1]+1))//无数字,ip地址有误
        {
            err++;
            continue;
        }
        
        
        for(i=0;i<4;i++)  //不是数字,ip地址有误
            if(num[i]<0)
            {
                err++;
                continue;
            }
        /*掩码有误*/
        int jud_err[4];
        int r;
        memset(jud_err, 0, 4);
        yanma[0]=trans_num(str, note[3]+1, note[4]);
        yanma[1]=trans_num(str, note[4]+1, note[5]);
        yanma[2]=trans_num(str, note[5]+1, note[6]);
        yanma[3]=trans_num(str, note[6]+1, length);
        for(i=0;i<4;i++)
        {
            r=0;
            for(j=0;j<9;j++)
                if(yanma[i]==jud[j])
                {
                    r=1;
                    break;
                }
            jud_err[i]=r;
        }
        r=0;
        r=all_0(yanma);
        r=all_255(yanma);
        for(i=0;i<4;i++)
            if(jud_err[i]==0)
            {
                r=1;
                break;
            }
        if(jud_yanma(yanma)) r=1;
        if(r==1)
        {
            err++;
            continue;
        }
        /*正确ip地址*/
        if (1<=num[0]&&num[0]<=126) A++;
        else if (128<=num[0]&&num[0]<=191) B++;
        else if (192<=num[0]&&num[0]<=223) C++;
        else if (224<=num[0]&&num[0]<=239) D++;
        else if (240<=num[0]&&num[0]<=255) E++;
        /*私人ip地址*/
        if(num[0]==10) pri++;
        if(num[0]==172)
            if('16'<=num[1]&&num[1]<='31') pri++;
        if(num[0]==198&&num[1]==168) pri++;
    }
    printf("%d %d %d %d %d %d %d\n",A,B,C,D,E,err,pri);
    return 0;
}

全部评论

相关推荐

04-17 14:31
江苏大学 Java
栖雨:深圳单休,这待遇完全付费上班吧
点赞 评论 收藏
分享
上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
牛客51274894...:意思是光刷力扣还不够卷
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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