文章目錄
- 題目描述
- 簡化題目
- 思路分析
- 法一(模拟):
- 法二(正則):
題目描述
給定一個字元串 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” 、 “[email protected]” 為無效IPv4位址。
一個有效的IPv6位址 是一個格式為“x1:x2:x3:x4:x5:x6:x7:x8” 的IP位址,其中:
例如 “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 <= xi.length <= 4
- xi 是一個 十六進制字元串 ,可以包含數字、小寫英文字母( ‘a’ 到 ‘f’ )和大寫英文字母( ‘A’ 到 ‘F’ )。
- 在 xi 中允許前導零。
簡化題目
IPv4規則:
- 按’.'分割字元串後需要長度為4;
- 分割的每個字元串長度在1到3之間;
- 可以解析為數字;
- 不含前導零然後大小在0到255之間;
IPv6規則:
- 按’:'分割字元串後需要長度為8;
- 且分割的每個字元串長度在1到4之間;
- 每個字元都需要在0-9或a-f或A-F中;
思路分析
按照上面的規則一步一步寫就可以了。
可以模拟,可以正則。
法一(模拟):
模拟法代碼寫的比較多,但是很好懂。
完整代碼
class Solution:
def validIPAddress(self, queryIP: str) -> str:
for i in queryIP:
if i == '.':
# IPV4
res = queryIP.split('.')
if len(res) != 4: # 分割後長度需為4.
return "Neither"
for j in res:
if not j.isdigit(): # 判斷是否隻有數字
return "Neither"
if int(j) < 0 or int(j) > 255: # 每個字元大小需要在 0~255之間
return "Neither"
if len(j)<1 or len(j)>3: # 每個字元長度需要在 1~3之間
return "Neither"
if j[0] == '0': # 若有前導0 則必須是隻有一個0,00都不行
if len(j) > 1:
return "Neither"
return "IPv4"
elif i == ':':
# IPV6
res = queryIP.split(":")
if len(res) != 8: # IPv6 長度為8
return "Neither"
for k in res:
if len(k) < 1 or len(k) > 4: # 每個字元長度為1~4
return "Neither"
temp = "0123456789abcdefABCDEF" # ipv6可能的字元
for p in k: # 每個字元看是不是在0~9 a~f A~F
if p not in temp:
return "Neither"
return "IPv6"
return "Neither"
法二(正則):
正則實際上不是整體去正則,那樣比較容易出錯還很亂,我是先分割了一下,然後再對每一個小塊進行正則。
class Solution:
def validIPAddress(self, queryIP: str) -> str:
import re
ipv4 = queryIP.split(".")
ipv6 = queryIP.split(":")
if len(ipv4) == 4:
for i in ipv4:
if not (re.match('^0$|(^[1-9]\d{0,2}$)',i) and int(i) < 256):
return "Neither"
return 'IPv4'
elif len(ipv6) == 8:
for j in ipv6:
if not re.match('^[0-9a-fA-F]{1,4}$',j):
return "Neither"
return 'IPv6'
return "Neither"