题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

以下主要为JS解题代码

  1. 每次循环得到一个输入'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']
  2. 根据测试用例和题意知道,应该先进行'0...'和'127...'判断,如果数组第一项等于0或者127,忽略该输入
  3. 子网掩码(mask)是否合法
    • 二进制下全为0或者1 违法 err++
    • 二进制下按位取反+1 得到temp
    • temp和mask按位或结果不等于mask err++
  4. 判断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(' '));
全部评论
能否解释一下存在空字段 if(illegal)的用法 有点儿不明白
点赞 回复 分享
发布于 2022-07-31 22:07

相关推荐

评论
4
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务