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