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

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

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

// 全注释版本
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
const strArr = [];
let a = 0,
    b = 0,
    c = 0,
    d = 0,
    e = 0,
    f = 0,
    g = 0;
void (async function () {
    // Write your code here
    while ((line = await readline())) {
        strArr.push(line);
    }
    // ip 分类判断
    function ipCate(v) {
        if (v[0] > 0 && v[0] < 127) {
            a++;
        } else if (v[0] > 127 && v[0] < 192) {
            b++;
        } else if (v[0] > 191 && v[0] < 224) {
            c++;
        } else if (v[0] > 223 && v[0] < 240) {
            d++;
        } else if (v[0] > 239 && v[0] < 256) {
            e++;
        }
    }
    // 私有IP判断
    function privateIp(v) {
        if (v[0] === 10) return true;
        if (v[0] === 172 && v[1] >= 16 && v[1] <= 31) return true;
        if (v[0] === 192 && v[1] === 168) return true;
        return false;
    }
    // 无效IP判断
    function isSafeIp(arr) {
        // 1. .分隔之后,输入的不是数字
        // 2.分隔后数组的长度不等于4
        // 3.分隔后数组有元素为空
        if (arr.length !== 4) {
            f++;
            return false;
        } else {
            for (let v of arr) {
                if (isNaN(v) || v === "" || v < 0 || v > 255) {
                    f++;
                    return false;
                }
            }
        }
        return true;
    }
    // 判断IP
    // 首先判断是不是无分类ip 开头0或者127
    // 再判断是不是合法ip
    // 再判断这个合法IP是不是私网IP
    // 最后判断这个ip的分类
    function ipChoose(str) {
        let ipArr = str.split(".");
        if (Number(ipArr[0]) !== 0 && Number(ipArr[0]) !== 127) {
            let isSafe = isSafeIp(ipArr);
            if (isSafe) {
                if (privateIp(ipArr.map(Number))) {
                    g++;
                }
                ipCate(ipArr);
            }
        }
    }
    // 判断子网掩码有效性
    function isUse(str) {
        let codeArr = str.split(".").map(Number);
        let codeStr = ''
        if (isSafeIp(codeArr)) {
            codeArr.forEach((v) => {
                // 这里不太理解为啥要转成2进制之后还要补全成8位
                // 不过根据查询结果最大8个1是255的10进制
                codeStr += parseInt(v, 10).toString(2).padStart(8, "0");
            });
            if (!/^1+0+$/g.test(codeStr)) {
                f++;
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    }

    function getRes(strArr) {
        for (let v of strArr) {
            const [ip, ma] = v.split("~");
            // 注意点
            // 1.子网掩码不正确无需再去判断uo
            // 2.特殊的ip,子网掩码也无需判断
            let ipArr = ip.split(".").map(Number);
            if (ipArr[0] !== 0 && ipArr[0] !== 127) {
                let use = isUse(ma);
                if (use) {
                    ipChoose(ip);
                } else {
                    continue;
                }
            } else {
                continue;
            }
        }
    }
    getRes(strArr)
    console.log(`${a} ${b} ${c} ${d} ${e} ${f} ${g}`)
})();

全部评论

相关推荐

05-20 21:57
已编辑
门头沟学院 Java
喜欢吃卤蛋的悲伤蛙在...:建信融通没消息吧,我2说有实习挂简历不理了
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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