题解 | #验证IP地址#

验证IP地址

https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880?tpId=295&tqId=1024725&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295

真的这道题写吐了我

class Solution {
  public:
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    string solve(string IP) {
      if (IP.empty()) {
        return "Neither";
      }
      
      split(IP);
      
      if (is_ipv4()) {
        return "IPv4";
      } else if (is_ipv6()) {
        return "IPv6";
      } else {
        return "Neither";
      }
    }
  
  private:
    void split(const std::string &s) {
      int i = 0;
      std::string tmp;
      
      while (i < s.size()) {
        int j = i;
        while (j < s.size() && std::isalnum(s[j])) {
          tmp += s[j];
          ++j;
        }
        res.push_back(tmp);
        tmp.clear();
        i = j + 1;
        //  末尾分隔符  或者连续的分隔符
        if (s[i] == ':' || s[i] == '.' || i == s.size() && !std::isalnum(s[j])) {
          res.push_back("-1");
          ++i;
        }
      }
    }
  
    bool is_ipv4() {
      if (res.size() != 4) {
        return false;
      }
      
      for (int i = 0; i < res.size(); ++i) {
        //  位数限制
        if (res[i].empty() || res[i].size() > 3) {
          return false;
        }
        
        //  内容限制
        for (int j = 0; j < res[i].size(); ++j) {
          if (!std::isdigit(res[i][j]) || res[i][0] == '0' && res[i].size() != 1) {
            return false;
          }
        }
        
        //  大小限制
        if (std::stoi(res[i]) < 0 || std::stoi(res[i]) >255) {
          return false;
        }
      }
      
      return true;
    }
  
    bool is_ipv6() {
      if (res.size() != 8) {
        return false;
      }
      
      for (int i = 0; i < res.size(); ++i) {
        //  位数限制
        if (res[i].empty() || res[i].size() > 4) {
          return false;
        }
        
        //  大小限制
        for (int j = 0; j < res[i].size(); ++j) {
          if (!(std::isdigit(res[i][j]) || res[i][j] <= 'f' && res[i][j] >= 'a' || res[i][j] >= 'A' && res[i][j] <= 'F')) {
            return false;
          }
        }
      }
      
      return true;
    }
  private:
    std::vector<std::string> res;
};
全部评论

相关推荐

点赞 评论 收藏
分享
牛客nb666号:看数据范围, -1e4~1e4, 用一个计数数组存一下, 再按个数让k减到0就行; 堆排不是O(n)的, 快速选择算法是O(n)但随机性较强
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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