验证IP地址

image.png

分治

strings.Split(string,byte)//字符串的拆分

对于 IPv4 地址,通过界定符 . 将地址分为四块;对于 IPv6 地址,通过界定符 : 将地址分为八块。
对于 IPv4 地址的每一块,检查它们是否在 0 - 255 内,且没有前置零。
对于 IPv6 地址的每一块,检查其长度是否为 1 - 4 位的十六进制数。

func validIPAddress(IP string) string {
    if validIPv4Address(IP) {
        return "IPv4"
    }
    if validIPv6Address(IP) {
        return "IPv6"
    }
    return "Neither"
}

func validIPv4Address(IP string) bool {
    strArr := strings.Split(IP, ".")
    if len(strArr) != 4 {
        return false
    }
    for _, str := range strArr {
        num, err := strconv.Atoi(str)
        if err != nil || num > 255 || num < 0 { //注意:err != nil
            return false
        }
        newStr := fmt.Sprint(num)
        if str != newStr {
            return false
        }
    }
    return true
}

func validIPv6Address(IP string) bool {
    strArr := strings.Split(IP, ":")
    if len(strArr) != 8 {
        return false
    }
    for _, str := range strArr {
        if len(str) == 0 || len(str) > 4 {
            return false
        }
        for i := 0; i < len(str); i++ {
            if !(str[i] >= '0' && str[i] <= '9') &&
                !(str[i] >= 'a' && str[i] <= 'f') &&
                !(str[i] >= 'A' && str[i] <= 'F') {
                return false
            }
        }
    }
    return true
}

正则

需二刷

func validIPAddress(IP string) string {
    if validIPv4Address(IP) {
        return "IPv4"
    }
    if validIPv6Address(IP) {
        return "IPv6"
    }
    return "Neither"
}

func validIPv4Address(IP string) bool {
    strArr := strings.Split(IP, ".")
    if len(strArr) != 4 {
        return false
    }
    for _, str := range strArr {
        if num, err := strconv.Atoi(str); err != nil || num > 255 || num < 0 {
            return false
        } else if strconv.Itoa(num) != str {
            return false
        }
    }
    return true
}
func validIPv6Address(IP string) bool {
    strArr := strings.Split(IP, ":")
    if len(strArr) != 8 {
        return false
    }
    re := regexp.MustCompile(`^([0-9]|[a-f]|[A-F])+$`)
    for _, str := range strArr {
        if len(str) == 0 || len(str) > 4 {
            return false
        }
        if !re.MatchString(str) {
            return false
        }
    }
    return true
}

作者:xilepeng
链接:https://leetcode-cn.com/problems/validate-ip-address/solution/go-jian-dan-jie-fa-zheng-ze-jie-fa-by-xi-pdgj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

库函数

net.ParseIP()

由于库函数没有判断前导零,我们需要加入判断语句

func validIPAddress(queryIP string) string {
    ip := net.ParseIP(queryIP)
    if ip == nil {
        return "Neither"
    }
    if ip.To4() != nil {
        for _, s := range strings.Split(queryIP, ".") {
            if len(s) > 1 && s[0] == '0' {
                return "Neither"
            }
        }
        return "IPv4"
    }
    for _, s := range strings.Split(queryIP, ":") {
        if len(s) > 4 || s == "" {
            return "Neither"
        }
    }
    return "IPv6"
}

最长公共前缀

image.png

纵向扫描/横向扫描

image.png
image.png
纵向:
https://segmentfault.com/a/11...

一个有趣的解法

image.png

字符串解码

image.png

参考官解,有辅助栈与LL1文法两种解法
https://leetcode-cn.com/probl...

使用栈的解法可以参考
https://leetcode-cn.com/probl...
比起官解更优秀


wric
10 声望3 粉丝

引用和评论

0 条评论