题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
38行:拆分函数和逐步求解
- 写一个 IP 地址转二进制字符串数组的函数处理地址和掩码
- 写一个计算掩码和地址的结果,用于对比是否处于一个局域网的函数
- 写一个判断是否是有效的 ip 地址或掩码的函数
- 最后先检查地址和掩码是否有效,再对比两个计算结果判定是否处于一个局域网,输出结果
代码
const convertIp2Binary = (ip) => ip
.split('.')
.map((i) => Number(i).toString(2).padStart(8, '0'));
const calc = (binaryArr, maskAddr) => {
return binaryArr.reduce((init, cur, idx) => {
const b1 = parseInt(cur, 2);
const b2 = parseInt(maskAddr[idx], 2);
return init + (b1 & b2);
}, '');
};
const isValidNumItem = (str) => ~~str < 256 && (str.length > 1 && str.startsWith('0') ? false : true);
const isValidIp = (addr) => {
const isValidAddr = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(addr);
if(isValidAddr) {
return addr.split('.').every(i => isValidNumItem(i));
}
return false;
};
const isValidMask = (addr) => {
const binaryStr = convertIp2Binary(addr).join('');
return isValidIp(addr) && binaryStr.indexOf(0) > binaryStr.lastIndexOf(1);
};
while ((mask = readline())) {
const ip1 = readline();
const ip2 = readline();
if (!isValidIp(ip1) || !isValidIp(ip2) || !isValidMask(mask)) {
console.log(1);
} else {
const str1 = calc(convertIp2Binary(ip1), convertIp2Binary(mask));
const str2 = calc(convertIp2Binary(ip2), convertIp2Binary(mask));
console.log(str1 === str2 ? 0 : 2);
}
}