• 93. 复原IP地址


    2020-10-19
    复原IP地址
     
    /**
     * @param {string} s
     * @return {string[]}
     */
    var restoreIpAddresses = function (s) {
      // 如果传入的字符串太长或者比255255255255还大 说明不可能有正常的IP
      if (s.length > 12 || Number(s) > 255255255255) return [];
      let ans = [];
    
      /**
       * 
       * @param {*} str 此次递归处理的字符串
       * @param {*} IP 暂时的一个IP的数组 每一项是ip的第0123项
       * @param {*} len 当前IP找到第几项了
       */
      const handle = (str, IP, len) => {
        // 如果剩下的字符串的长度 比 这个还长 说明字符串太多了 可以直接return出来
        // 例如:当前找到IP的第2项 str 如果还有7位 就不可能是合理的IP 因为剩下两项顶多有6位
        // 如果 str 已经为空字符串了 也直接return 
        // 例如找完10.10.2.3之后 紧接着会回到第2位把2变成23 然后找第3位 此时str已经是空 也就是 10.10.23.'' 这种情况如果不处理就会漏掉
        if (str.length > (4 - len) * 3 || !str) return;
        // IP的每一项都可能是 1-3 位的数
        for (let i = 0; i < 3; i++) {
          // 当在找第4位的IP的时候 如果有剩余str肯定是不行的 比如当前在找第4位 此时str='123' 
          // 当i=0时 第四位得到的值是1 但是str就还剩23多余 所以i!=1 应该找i=2或者i=3合不合适
          if (len === 3 && str.length - (i + 1) > 0) continue;
          // tmp 是此次 IP 第 len 项的值
          const tmp = str.slice(0, i + 1);
          // 如果 当前位的IP是3位 且比255大 直接return
          // 如果出现 01 011 这种 0 开头的 直接return
          if (Number(tmp) > 255 || (tmp.length > 1 && tmp[0] === '0')) return;
          // 重写IP的第len项 
          IP[len] = tmp;
          // 如果len已经等于3说明找到了完整合格的IP 放入ans中 如果str还有剩余是不可能走到这里的 在上面就return了
          if (len === 3) {
            ans.push(IP.join('.'));
            return;
          }
          // 如果len还不到3 那就继续往下找
          if (len < 3 && str.length) {
            // 注意 每次往下找 应该截取tmp之后的字符串作为下次的str
            handle(str.slice(i + 1), IP, len + 1);
          }
        }
      }
    
      handle(s, [], 0);
      return ans;
    };

  • 相关阅读:
    高精度“+”算法
    漏洞扫描
    端口扫描
    使用sqlmap
    Kali实现靶机远程控制
    Docker下配置KeepAlive支持nginx高可用
    web攻防环境--一句话木马
    Docker容器技术--自定义网桥后的默认网卡名称
    小白大数据学习指南
    Nginx简单操作
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/13841504.html
Copyright © 2020-2023  润新知