468. 验证IP地址
给定一个字符串 queryIP
。如果是有效的 IPv4 地址,返回 "IPv4"
;如果是有效的 IPv6 地址,返回 "IPv6"
;如果不是上述类型的 IP 地址,返回 "Neither"
。
有效的IPv4地址 是 “x1.x2.x3.x4”
形式的IP地址。 其中 0 <= xi <= 255
且 xi
不能包含 前导零。例如: “192.168.1.1”
、 “192.168.1.0”
为有效IPv4地址, “192.168.01.1”
为无效IPv4地址; “192.168.1.00”
、 “192.168@1.1”
为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8”
的IP地址,其中:
1 <= xi.length <= 4
xi
是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a'
到 'f'
)和大写英文字母( 'A'
到 'F'
)。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 地址。
示例 1:
输入:queryIP = "172.16.254.1" 输出:"IPv4" 解释:有效的 IPv4 地址,返回 "IPv4"
示例 2:
输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334" 输出:"IPv6" 解释:有效的 IPv6 地址,返回 "IPv6"
示例 3:
输入:queryIP = "256.256.256.256" 输出:"Neither" 解释:既不是 IPv4 地址,又不是 IPv6 地址
提示:
queryIP
仅由英文字母,数字,字符 '.'
和 ':'
组成。相似题目
原站题解
python3 解法, 执行用时: 40 ms, 内存消耗: 14.8 MB, 提交时间: 2023-03-09 16:12:55
class Solution: def validIPAddress(self, queryIP: str) -> str: if re.match('^((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)($|(?!\.$)\.)){4}$', queryIP): return 'IPv4' elif re.match('^(([\da-fA-F]{1,4})($|(?!:$):)){8}$', queryIP): return 'IPv6' else: return 'Neither'
javascript 解法, 执行用时: 64 ms, 内存消耗: 41.2 MB, 提交时间: 2023-03-09 16:10:57
/** * @param {string} queryIP * @return {string} */ var validIPAddress = queryIP => queryIP.match(/^((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)($|(?!\.$)\.)){4}$/) ? "IPv4": queryIP.match(/^(([\da-fA-F]{1,4})($|(?!:$):)){8}$/) ? "IPv6" : "Neither";
java 解法, 执行用时: 0 ms, 内存消耗: 39.6 MB, 提交时间: 2023-03-09 16:09:57
class Solution { public String validIPAddress(String queryIP) { if (queryIP.indexOf('.') >= 0) { // IPv4 int last = -1; for (int i = 0; i < 4; ++i) { int cur = (i == 3 ? queryIP.length() : queryIP.indexOf('.', last + 1)); if (cur < 0) { return "Neither"; } if (cur - last - 1 < 1 || cur - last - 1 > 3) { return "Neither"; } int addr = 0; for (int j = last + 1; j < cur; ++j) { if (!Character.isDigit(queryIP.charAt(j))) { return "Neither"; } addr = addr * 10 + (queryIP.charAt(j) - '0'); } if (addr > 255) { return "Neither"; } if (addr > 0 && queryIP.charAt(last + 1) == '0') { return "Neither"; } if (addr == 0 && cur - last - 1 > 1) { return "Neither"; } last = cur; } return "IPv4"; } else { // IPv6 int last = -1; for (int i = 0; i < 8; ++i) { int cur = (i == 7 ? queryIP.length() : queryIP.indexOf(':', last + 1)); if (cur < 0) { return "Neither"; } if (cur - last - 1 < 1 || cur - last - 1 > 4) { return "Neither"; } for (int j = last + 1; j < cur; ++j) { if (!Character.isDigit(queryIP.charAt(j)) && !('a' <= Character.toLowerCase(queryIP.charAt(j)) && Character.toLowerCase(queryIP.charAt(j)) <= 'f')) { return "Neither"; } } last = cur; } return "IPv6"; } } }
golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2023-03-09 16:09:25
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" }
python3 解法, 执行用时: 32 ms, 内存消耗: 14.9 MB, 提交时间: 2023-03-09 16:07:48
class Solution: def validIPAddress(self, queryIP: str) -> str: if '.' in queryIP: arr = queryIP.split('.') if len(arr) != 4: return 'Neither' for q in arr: if not q.isdigit(): return 'Neither' if str(int(q)) != q: return 'Neither' if int(q) > 255: return 'Neither' return 'IPv4' if ':' in queryIP: arr = queryIP.split(':') if len(arr) != 8: return 'Neither' for i in range(8): if len(arr[i]) > 4 or len(arr[i]) < 1: return 'Neither' for c in arr[i]: if not c.isalnum(): return 'Neither' if c.isalpha(): if (not 'A' <= c <= 'F') and (not 'a' <= c <= 'f'): return 'Neither' return 'IPv6' return 'Neither'