给定一个字符串 queryIP(queryIP 仅由英文字母,数字,字符 '.' 和 ':' 组成)。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 < = x i < = 255 0 <= x_i <= 255 0<=xi<=255 且 x i x_i xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。“192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:
- 1 < = x i . l e n g t h < = 4 1 <= x_i.length <= 4 1<=xi.length<=4
- x i xi xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。
- 在 x i x_i xi 中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 和"2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址,而"2001:0db8:85a3::8A2E:037j:7334" 和"02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。相关标签:字符串。
Validate IP AddressInput: queryIP = "172.16.254.1" Output: "IPv4" Explanation: This is a valid IPv4 address, return "IPv4".
Input: queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334" Output: "IPv6" Explanation: This is a valid IPv6 address, return "IPv6".
Input: queryIP = "256.256.256.256" Output: "Neither" Explanation: This is neither a IPv4 address nor a IPv6 address.
这题不是很难,虽然代码长一些但是思路上比较简单。题意是给我们一个字符串,然后让我们判断一下这个字符串是不是合法的IPV4或者IPV6或者啥也不是。
class Solution {
public:
vector split(string ip, char t) {
vector items;
for (int i = 0; i < ip.size(); i ++ ) {
int j = i;
string item;
while (ip[j] != t) item += ip[j ++ ];
i = j;
items.push_back(item);
}
return items;
}
string check_ipv4(string ip) {
auto items = split(ip + '.', '.');
if (items.size() != 4) return "Neither";
for (auto item: items) {
if (item.empty() || item.size() > 3) return "Neither";
if (item.size() > 1 && item[0] == '0') return "Neither";
for (auto c: item)
if (c < '0' || c > '9') return "Neither";
int t = stoi(item);
if (t > 255) return "Neither";
}
return "IPv4";
}
bool check(char c) {
if (c >= '0' && c <= '9') return true;
if (c >= 'a' && c <= 'f') return true;
if (c >= 'A' && c <= 'F') return true;
return false;
}
string check_ipv6(string ip) {
auto items = split(ip + ':', ':');
if (items.size() != 8) return "Neither";
for (auto item: items) {
if (item.empty() || item.size() > 4) return "Neither";
for (auto c: item)
if (!check(c)) return "Neither";
}
return "IPv6";
}
string validIPAddress(string ip) {
if (ip.find('.') != -1 && ip.find(':') != -1) return "Neither";
if (ip.find('.') != -1) return check_ipv4(ip);
if (ip.find(':') != -1) return check_ipv6(ip);
return "Neither";
}
};
func validIPAddress(queryIP string) string {
if sp := strings.Split(queryIP, "."); len(sp) == 4 {
for _, s := range sp {
if len(s) > 1 && s[0] == '0' {
return "Neither"
}
if v, err := strconv.Atoi(s); err != nil || v > 255 {
return "Neither"
}
}
return "IPv4"
}
if sp := strings.Split(queryIP, ":"); len(sp) == 8 {
for _, s := range sp {
if len(s) > 4 {
return "Neither"
}
if _, err := strconv.ParseUint(s, 16, 64); err != nil {
return "Neither"
}
}
return "IPv6"
}
return "Neither"
}



