题解 | #判断两个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);
  }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务