题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
let str;
let a=0,b=0,c=0,d=0,e=0,f=0,g=0;
while(str = readline()){
let strArr = str.split(' ');
getRes(strArr)
}
function getRes(strArr){
for(let v of strArr){
let vArr = v.split('~');
//这里题目有个小坑,就是如果子网掩码不正确了,那么我们就不需要再去判断IP了,我也是看了好久才发现
//第二个坑,如果是特殊的IP,那么子网掩码也不需要判断,我真的是被坑死了
//这种题写的就很想骂人...
let ipArr = vArr[0].split('.');
if(ipArr[0] != 0 && ipArr[0] != 127){
let use = isUse(vArr[1]);
if(use){//正确了再去判断IP的分类跟私有的问题
ipChoose(vArr[0])
}else{
continue;
}
}else{
continue;
}
}
}
//判断子网掩码有效性
function isUse(str){
let codeArr = str.split('.');
if(unSafeIp(codeArr)){
let codeStr = '';
codeArr.forEach((v)=>{
codeStr += parseInt(v,10).toString(2).padStart(8, '0');
})
if(!/^1+0+$/g.test(codeStr)){
f++;
return false;
}else{
return true;
}
}else{
return false;
}
}
//判断IP
function ipChoose(str){
let ipArr = str.split('.');
if(ipArr[0] != 0 && ipArr[0] != 127){
let use = unSafeIp(ipArr);
if(use){
if(privateIp(ipArr)){
g++;
}
ipCate(ipArr);
}
}
}
//无效IP判断
function unSafeIp(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判断
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 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++;
}
}
console.log(a,b,c,d,e,f,g)
联想公司福利 1502人发布
查看17道真题和解析
