【算法训练】LeetCode#468 验证IP地址

一、描述

468. 验证IP地址

给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither"

有效的IPv4地址“x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255xi 不能包含 前导零。例如: “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 地址

二、思路

这道题也没有什么算法或者数据结构相关的难点,就是依照条件做判别即可。

(毫无意义的一道题)

三、解题


public class LeetCode468 {

    public static String validIPAddress(String queryIP) {
        if (queryIP.contains(".")){
            // 如果有‘ . ’则去判断是否为ipv4
            if (judgeIPv4(queryIP)){
                return "IPv4";
            } else {
                return "Neither";
            }
        } else if (queryIP.contains(":")){
            // 如果有‘ : ’,则去判断是否为 IPV6
            if (judgeIPv6(queryIP)){
                return "IPV6";
            }else {
                return "Neither";
            }
        } else{
            return "Neither";
        }
    }

    // 判断ipv4
    public static boolean judgeIPv4(String ip){
        // 主要就是三点
        // 1. 包含四个部分,x0.x1.x2.x3,
        String[] ips = ip.split("\\.",-1); // 当出现1.2.3.3.时,回切分为‘1’,‘2’,‘3’,‘’,不回忽略最后的空字符
        if (ips.length != 4){
            // 如果长度不为4则一定不合法
            return false;
        }
        for (String str : ips){

        // 2. 不能有前导零
            if (str == null || "".equals(str) || str.charAt(0) == '0' && str.length() != 1){
                // 如果任意一段包含前导零(0.0这样合法因此判断长度)
                return false;
            }
            char[] curStr = str.toCharArray();
            int temp = 1; // 如果长度为3,则左侧就×100,为了转数字,判断是否在0-255
            int num = 0;
            for (int i = curStr.length-1 ; i >= 0 ; i-- ){
                // 判断是否有非数字
                if (curStr[i] - '0' < 0 || curStr[i] -'0' > 9){
                    return false;
                }
                num += temp*(curStr[i]-'0');
                temp *= 10;
            }
        // 3. 每段范围在0-255
            if (num > 255 || num < 0){
                return false;
            }
        }
        return true;
    }


    // 判断ipv6
    public static boolean judgeIPv6(String ip){
        // 主要就是三点
        String[] ips = ip.split(":",-1);
        if (ips.length != 8){
            // 如果长度不为8则一定不合法
            return false;
        }
        for (String str : ips){
            if (str == null || "".equals(str) || str.length() < 1 || str.length() > 4){
                // 如果任意一段长度不在1-4,不合法
                return false;
            }
            char[] curStr = str.toCharArray();
            for (char c : curStr){
                // 判断是否在A-F或a-f或0-9
                if (c>='A' && c<='F' || c>='a' && c<='f' || c>='0' && c<='9'){
                    continue;
                }
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        validIPAddress("1.0.1.");
    }
}
posted @ 2023-02-26 16:07  小拳头呀  阅读(29)  评论(0编辑  收藏  举报