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

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

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

let data = [];
while(line = readline()){
    let ipMark = line.split('~');
    data.push({
        ip:ipMark[0],//输入的IP地址
        mark:ipMark[1]//输入的子网掩码
    })
}

//合法私有IP的判断
function isPriIp(ip){
    let flag = false;//默认不是合法私有ip
    let arr = ip.split('.');
    let first = parseInt(arr[0]);
    let second = parseInt(arr[1]);
    if((first === 10) || (first === 172 && (second >= 16 && second <= 31)) || (first === 192 && second === 168)){
        flag = true;
    }
    return flag;
}

// 子网掩码合法的判断
function checkSubnet(mark){
    let isValid = true;//默认子网掩码是合法的
    let arr = mark.split('.');
    let binary = '';
    // 转成二进制 不足八位的 补零
    arr.forEach(item=>{
        binary += parseInt(item).toString(2).padStart(8,'0');
    })
    //子网掩码是连续1,如果后面有个0,接着后面全部是0,所以子网掩码不会有'01',只会有'10'
    if(binary.indexOf('01') > -1){
        isValid = false;
    }else if(binary.indexOf('1') < 0 || binary.indexOf('0') < 0){//子网掩码也不能是全1或全0
        isValid = false;
    }
    return isValid;
}

//ip归类 判断
let ipReg = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
function checkIp(){
    let counter = {
        ipA:0,
        ipB:0,
        ipC:0,
        ipD:0,
        ipE:0,
        ipMarkErr:0,
        privateIp:0
    };
    data.forEach(item=>{
        let first = parseInt(item.ip.split('.')[0]);
        if(first === 0 || first === 127){//啥也不是
            return;
        }else if(!checkSubnet(item.mark)){//非法子网掩码
            counter.ipMarkErr++;
        }else if(!ipReg.test(item.ip)){//错误IP地址
            counter.ipMarkErr++;
        }else{
            if(isPriIp(item.ip)){//私有ip
                counter.privateIp++;
            }
            if(first > 0 && first < 127){//A类地址
                counter.ipA++;
            }else if(first > 127 && first < 192){//B类地址
                counter.ipB++;
            }else if(first > 191 && first < 224){//C类地址
                counter.ipC++;
            }else if(first > 223 && first < 240){//D类地址
                counter.ipD++;
            }else if(first > 239 && first < 256){//E类地址
                counter.ipE++;
            }
        }
    })
    console.log(counter.ipA+" "+counter.ipB+" "+counter.ipC+" "+counter.ipD+" "+counter.ipE+" "+counter.ipMarkErr+" "+counter.privateIp);
}
checkIp();

全部评论

相关推荐

10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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