Skip to content

Latest commit

 

History

History

0468.Validate IP Address

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

English Version

题目描述

给定一个字符串 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

Java

TypeScript

function validIPAddress(queryIP: string): string {
    const isIPv4 = () => {
        const ss = queryIP.split('.');
        if (ss.length !== 4) {
            return false;
        }
        for (const s of ss) {
            const num = Number(s);
            if (num < 0 || num > 255 || num + '' !== s) {
                return false;
            }
        }
        return true;
    };
    const isIPv6 = () => {
        const ss = queryIP.split(':');
        if (ss.length !== 8) {
            return false;
        }
        for (const s of ss) {
            if (s.length === 0 || s.length > 4) {
                return false;
            }
            for (const c of s) {
                if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
                    continue;
                }
                return false;
            }
        }
        return true;
    };
    if (isIPv4()) {
        return 'IPv4';
    }
    if (isIPv6()) {
        return 'IPv6';
    }
    return 'Neither';
}

Rust

impl Solution {
    fn is_IPv4(s: &String) -> bool {
        let ss = s.split('.').collect::<Vec<&str>>();
        if ss.len() != 4 {
            return false;
        }
        for s in ss {
            match s.parse::<i32>() {
                Err(_) => return false,
                Ok(num) => {
                    if num < 0 || num > 255 || num.to_string() != s.to_string() {
                        return false;
                    }
                }
            }
        }
        true
    }


    fn is_IPv6(s: &String) -> bool {
        let ss = s.split(':').collect::<Vec<&str>>();
        if ss.len() != 8 {
            return false;
        }
        for s in ss {
            if s.len() == 0 || s.len() > 4 {
                return false;
            }
            for &c in s.as_bytes() {
                if c >= b'0' && c <= b'9' || c >= b'a' && c <= b'f' || c >= b'A' && c <= b'F' {
                    continue;
                }
                return false;
            }
        }
        true
    }


    pub fn valid_ip_address(query_ip: String) -> String {
        if Self::is_IPv4(&query_ip) {
            return String::from("IPv4");
        }
        if Self::is_IPv6(&query_ip) {
            return String::from("IPv6");
        }
        String::from("Neither")
    }
}

...