题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
以下主要为JS解题代码
- 每次循环得到一个输入'10.70.44.68-255.254.255.0'之后,首先通过'~'分解为arr =['10.70.44.68','255.254.255.0']
ip = arr[0],将ip地址以'.'分割,得到['10','70','44','68'] - 根据测试用例和题意知道,应该先进行'0...'和'127...'判断,如果数组第一项等于0或者127,忽略该输入
- 子网掩码(mask)是否合法
- 二进制下全为0或者1 违法 err++
- 二进制下按位取反+1 得到temp
- temp和mask按位或结果不等于mask err++
- 判断ip地址是否合法:
-
是否有空字段'',有 -> 错误ip地址++ -> err++
-
IP地址合法 根据数组第一项分类:
- 如果 1<=arr[0]<=126---------A类 a++
- 如果128<=arr[0]<=191---------B类 b++
- 如果192<=arr[0]<=223---------C类 c++
- 如果224<=arr[0]<=239---------D类 d++
- 如果240<=arr[0]<=255---------E类 e++
-
私网IP
- 根据数组第一项和第二项进行判断
- 如果数组第一项等于10, pIp ++
- 如果数组第一项等于172,且: 第二项 16<=arr[2]<=31 pIp ++
- 如果数组第一项等于192,且: 第二项 arr[2] == 168 pIp ++
-
function readline(i) {//用node模拟ACM风格代码
let strs = [
'221.249.44.138~255.255.241.0',
'204.20.192.203~255.0.0.0',
'38.98.249.11~255.174.255.255'
];
return strs[i];
}
function validMask(str) {//模拟二进制按位取反和按位与操作
if(str==='0.0.0.0' || str==='255.255.255.255') return false;//判断是否为全0或者全1
str = str.split('.').map(it => (+it).toString(2).padStart(8,0)).join('');//转换为二进制,不足8位的左侧补0
str = str.split('');
let m = str.map(it => it ^ '1').join('');//按位取反
m = (parseInt(m, 2) + 1).toString(2).padStart(32, 0);//转换成10进制+1之后转换为2进制,补齐成32位
m = m.split('').map((it, i) => it | str[i]).join('');//按位或,如果和原二进制字符串相同则合法,否则不合法
return m === str.join('');
}
let i = 0;
let line;
let result = {
'a': 0,
'b': 0,
'c': 0,
'd': 0,
'e': 0,
'err': 0,
'pIp': 0,
}
while (line = readline(i)) {
line = line.split('~');
let ip = line[0].split('.');//获取IP字符串
let illegal = ip.some(it => !it);//判断IP字符串中是否含有空字段
ip = ip.map(it => +it);
let mask = line[1];//获取子网掩码字符串
if (ip[0] === 0 || ip[0] === 127) {//根据测试用例来看应该先进行此判断
i++;
continue;
}
if (!validMask(mask)) {//子网掩码非法
result['err']++;
i++;
continue;
}
if (illegal) {//存在空字段,非法
console.log('ill')
result['err']++;
} else {
if (ip[0] >= 1 && ip[0] <= 126) {//a类
if (ip[0] === 10) {
result['pIp']++;//进行私有网络判断,与a类不冲突
}
result['a']++;
} else if (ip[0] >= 128 && ip[0] <= 191) {
if (ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31){
result['pIp']++;//进行私有网络判断,与a类不冲突
}
result['b']++;
} else if (ip[0] >= 192 && ip[0] <= 223) {
if(ip[0]===192&&ip[1]===168){
result['pIp']++;//进行私有网络判断,与a类不冲突
}
result['c']++;
} else if (ip[0] >= 224 && ip[0] <= 239) {
result['d']++;
} else if (ip[0] >= 240 && ip[0] <= 255) {
result['e']++;
}
}
i++;
}
console.log(Object.values(result).join(' '));
