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