题目描述
给定一个字符串 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
仅由英文字母,数字,字符'.'
和':'
组成。
难度是中等,但通过率异常低。这种情况 往往是因为题目的细节太多了,让解题直接变成面向测试编程。我尝试了三次,成功了。
class Solution:
def validIPAddress(self, queryIP: str) -> str:
strLs4 = '0123456789'
strLs6 = '0123456789abcdefABCDEF'
ls = []
# IPv4判断
if '.' in queryIP:
ls=queryIP.split('.')
# 判断分隔长度
if len(ls)!=4:
return 'Neither'
for i in range(len(ls)):
# 长度判断
if not 1<=len(ls[i])<=3:
return 'Neither'
# 前导零判断
if( len(ls[i])>1 and ls[i][0]=='0'):
return 'Neither'
for j in range(len(ls[i])):
if ls[i][j] not in strLs4:
return 'Neither'
if not( 0<=int(ls[i])<=255):
return 'Neither'
return 'IPv4'
# IPv6判断
elif ':' in queryIP:
ls = queryIP.split(':')
# 判断分隔长度
if len(ls)!=8:
return 'Neither'
for i in range(len(ls)):
#长度判断
if not 1<=len(ls[i])<=4:
return 'Neither'
for j in range(len(ls[i])):
if ls[i][j] not in strLs6:
return 'Neither'
return 'IPv6'
# 啥都不含
else:
return 'Neither'
只能说这是道细节题,可以用正则表达式,但只是写法上简单了,实际执行还是慢了一步,快的方法都是一点点判断,得出结果。