题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
function isInvalidIP(ip){
//ip 地址为 [0-255]
return ip.split('.').some((v)=>{
let part = parseInt(v);
return part < 0 || part >= 256;
})
}
function isInvalidMask(mask){
// 先判断是否在[0-255]之间
if(isInvalidIP(mask)){
return true;
}
// 再判断是否是连续的1开头
let m2 = [];
mask.split('.').forEach((v)=>{
//每个部分转为2进制
let l = parseInt(v).toString(2);
let zero = '';
//不足8位的用0补充在最开始部分
if(l < 8){
for(let i = 0; i < 8-l;i++){
zero+='0';
}
l = zero + l;
}
m2.push(l);
});
//m2为最终的2进制串
m2 = m2.join('');
// 第一个0出现的位置
let i = m2.indexOf('0');
// 最后一个1出现的位置
let j = m2.lastIndexOf('1');
// 第一个0出现的位置在最后一个1出现的位置的右侧即非法
return i < j;
}
function isSameSubweb(ip1, ip2, mask){
// 直接把2个ip的子网计算出来再逐一比较
let sub1 = [], sub2 = [];
let a = ip1.split('.').map(v => parseInt(v));
let b = ip2.split('.').map(v => parseInt(v))
let m = mask.split('.').map(v => parseInt(v));
for(let i = 0; i < 4; i++){
sub1.push(a[i]&m[i]);
sub2.push(b[i]&m[i]);
}
for(let i = 0; i < 4; i++){
if(sub1[i] !== sub2[i]){
return false;
}
return true;
}
}
void async function () {
// Write your code here
while(line = await readline()){
let mask = line;
line = await readline()
let ip1 = line;
line = await readline()
let ip2 = line;
if(isInvalidMask(mask) || isInvalidIP(ip1) || isInvalidIP(ip2)){
//非法
console.log(1);
}else{
//合法
if(isSameSubweb(ip1, ip2, mask)){
console.log(0);
}
else{
console.log(2);
}
}
}
}()
查看15道真题和解析