题解 | #识别有效的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;

void (async function () {
    let info = {
        A: 0,
        B: 0,
        C: 0,
        D: 0,
        E: 0,
        Error: 0,
        Private: 0,
    };

    let ArrIp = []; //存放IP
    let ArrMask = []; //存放子网掩码
    // Write your code here

    while ((line = await readline())) {
        ArrIp.push(line.split("~")[0]);
        ArrMask.push(line.split("~")[1]);
    }

    for (let i = 0; i < ArrMask.length; i++) {
        // 先排除非法子网掩码,如果子网掩码错误,那对应的IP也就不用看了
        let MaskStr = ""; //用于拼接子网掩码转成的二进制

        ArrMask[i].split(".").map((v) => {
            MaskStr =
                MaskStr +
                "00000000".slice(0, 8 - Number(v).toString(2).length) +
                Number(v).toString(2);
        });

        if (ArrIp[i].split(".")[0] == 0 || ArrIp[i].split(".")[0] == 127) {
            // 如果IP开头为0或127.不记录任何位置
            delete ArrIp[i]; // 排除数组中对应的IP
        } else if (
            MaskStr.indexOf("1") == -1 ||
            MaskStr.indexOf("0") == -1 ||
            MaskStr.indexOf("01") != -1 ||
            ArrMask[i].split(".").length != 4 // 全为0,或者全为1不合法,掩码转为二进制后,如果存在01,说明不为连续的0和连续的1
        ) {
            info.Error++;
            delete ArrIp[i];
        }
    }

    for (let i = 0; i < ArrIp.length; i++) {
        // 这里是对IP的分类,我这儿是硬排,先看是否是错误IP,再对IP进行分类
        if (ArrIp[i]) {
            let newArrItem = ArrIp[i].split(".");
            if (
                !newArrItem[0] ||
                !newArrItem[1] ||
                !newArrItem[2] ||
                !newArrItem[3]
            ) {
                info.Error++;
            } else if (newArrItem[0] > 0 && newArrItem[0] < 127) {
                info.A++;
                if (newArrItem[0] == 10) {
                    info.Private++;
                }
            } else if (newArrItem[0] > 127 && newArrItem[0] < 192) {
                info.B++;
                if (
                    newArrItem[0] == 172 &&
                    newArrItem[1] > 15 &&
                    newArrItem[1] < 32
                ) {
                    info.Private++;
                }
            } else if (newArrItem[0] > 191 && newArrItem[0] < 224) {
                info.C++;
                if (newArrItem[0] == 192 && newArrItem[1] == 168) {
                    info.Private++;
                }
            } else if (newArrItem[0] > 223 && newArrItem[0] < 240) {
                info.D++;
            } else if (newArrItem[0] > 239 && newArrItem[0] < 256) {
                info.E++;
            }
        }
    }

    console.log(
        info.A +
            " " +
            info.B +
            " " +
            info.C +
            " " +
            info.D +
            " " +
            info.E +
            " " +
            info.Error +
            " " +
            info.Private
    );
})();

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务