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