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