Leetcode0468. 验证IP地址(medium)

目录

1. 问题描述

2. 思路与算法

3. 代码实现


1. 问题描述

给定一个字符串 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地址,其中:

  • 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 仅由英文字母,数字,字符 '.' 和 ':' 组成。

2. 思路与算法

        采用类似于决策树的方法来逐步逐层判断。

  •         step1: 数输入字符串queryIP中的“.”或者“:”的个数,如果“.”的个数是3则转向step2进行IPv4判断,如果“:”的个数是7则转向step3进行IPv6判断 
  •         step2: 进行IPv4判断。针对4个字段分别判断合法性,4个都合法的话就是IPv4
    • 2.1:是否存在leading zeros?如果存在的话则不是IPv4
    • 2.2:是否是数字字符串且其值在0到255之间?
  •         step3: 进行IPv6判断。针对8个字段分别判断合法性,8个都合法的话就是IPv6。
    • 3.1:首先字段长度是否在1到4之间?
    • 3.2:其中所含字符是否为包含在0~9, a~f或A~F之中

        以下代码中使用python内置的字符串处理函数ord(), str.split(), str.isdigit()进行判断处理。

        如果熟悉正则处理的话应该可以写出更加紧凑的代码实现来。 

3. 代码实现

class Solution:
    def validIPAddress(self, queryIP: str) -> str:
        def isValidIPv4Field(s):
            if len(s)>1 and s.find('0')==0:
                return False
            if s.isdigit():
                return 0 <= int(s) <= 255
            return False
        
        def isValidIPv6Field(s):
            if 0<len(s)<=4:
                for k in range(len(s)):
                    if not (48<=ord(s[k])<=57 or 97<=ord(s[k])<=102 or 65<=ord(s[k])<=70):
                        return False
                return True
            return False
            
        if queryIP.count('.') == 3:
            # Possibly IPv4
            a = queryIP.split('.')
            for k in range(4):
                if not isValidIPv4Field(a[k]):
                    return "Neither"
            return "IPv4"
        elif queryIP.count(':') == 7:
            # Possibly IPv6
            a = queryIP.split(':')
            for k in range(8):
                if not isValidIPv6Field(a[k]):
                    return "Neither"
            return "IPv6"
        return "Neither"

         回到总目录:Leetcode每日一题总目录(动态更新。。。)

猜你喜欢

转载自blog.csdn.net/chenxy_bwave/article/details/125026545