点击:题目链接:编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
如果是有效的 IPv4 地址,返回 “IPv4” ;
如果是有效的 IPv6 地址,返回 “IPv6” ;
如果不是上述类型的 IP 地址,返回 “Neither” 。
IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如,2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。
思路
处理字符串的题目。需要额外地注意多种边界情况。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
   | class Solution { public:     string validIPAddress(string IP) {
          int space = 0;         while (space != IP.npos) {             space = IP.find(" ");             if (space != IP.npos) IP.erase(space, 1);         }         if (IP.empty()) return "Neither";         if (IP[IP.size() - 1] == '.' || IP[IP.size() - 1] == ':') return "Neither";
          if (isIPV4(IP)) {             return "IPv4";         }                  if (isIPV6(IP)) {             return "IPv6";         }
          return "Neither";     }
      bool isIPV4(string IP) {         int count = 0;
          while (!IP.empty()) {             ++count;             int index = IP.find(".");             string temp;             if (index == -1) {                 temp = IP;                 IP.erase(0, temp.size());
              }             else {                 temp = IP.substr(0, index);                 IP.erase(0, index + 1);             }
              if ((temp.size()!= 1 && temp[0] == '0')|| temp.size()>3) return false;
              if (temp == "") return false;
              for (auto a : temp) {                 if (!(a >= '0' && a <= '9') ) return false;             }
              if (!(stoi(temp) >= 0 && stoi(temp) <= 255)) return false;                      }
          if (count != 4) return false;
          return true;     }
      bool isIPV6(string IP) {         int count = 0;
          while (!IP.empty()) {             ++count;             int index = IP.find(":");
              string temp;             if (index == IP.npos) {                 temp = IP;                 IP.erase(0, temp.size());             }             else {                 temp = IP.substr(0, index);                 IP.erase(0, index + 1);             }
              if (temp.size() > 4 || temp == "") return false;
              for (auto a : temp) {                 if (!((a <= 'f' && a >= 'a') || (a <= 'F' && a >= 'A') || (a <= '9' && a >= '0'))) {                     return false;                 }             }         }
          if (count != 8) return false;         return true;     } };
  | 
 
思路
可以直接使用正则表达式,方便快捷
代码