每日一题:Leetcode-468 验证IP地址

力扣题目

解题思路

java代码

力扣题目:

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

解题思路:

算法原理
通过对输入的字符串按照不同的分隔符(. 用于 IPv4 ,: 用于 IPv6)进行分割,然后对分割后的每个部分进行长度、字符范围和数值范围(对于 IPv4)的检查,以确定输入的字符串是有效的 IPv4 地址、IPv6 地址还是都不是。

思路
首先判断字符串中包含的是 . 还是 : 来确定可能的地址类型。

  • 如果是 . ,则按照 . 分割成 4 部分,检查每部分的长度、首位是否为 0 且长度大于 1、字符是否都是数字以及数值是否在 0 - 255 之间。
  • 如果是 : ,则按照 : 分割成 8 部分,检查每部分的长度是否符合要求(不超过 4 且不为 0 ),字符是否在十六进制数字和字母的范围内。
  • 如果既不包含 . 也不包含 : ,则返回 "Neither" 。

代码分析

  • 首先通过 contains 方法判断字符串中包含的分隔符类型。
  • 根据不同的分隔符进行分割,并获取分割后的数组。
  • 对于 IPv4 地址,进行多轮检查,包括长度、首位 0 情况、字符类型和数值范围。
  • 对于 IPv6 地址,进行长度和字符类型的检查。
  • 如果所有检查都通过,返回对应的地址类型,否则返回 "Neither" 。

时间复杂度:O(n),其中  是输入字符串的长度。主要的时间消耗在分割字符串、遍历分割后的部分以及进行各种检查操作上,这些操作的次数都与字符串的长度线性相关。

空间复杂度:O(n),主要用于存储分割后的字符串数组以及在处理过程中的一些临时变量,空间开销与输入字符串的长度成正比。

java代码:

package org.example;

public class Leetcode468 {
    public static void main(String[] args) {
        System.out.println(validIPAddress("2001:0db8:85a3:0:0:8A2E:0370:7334"));
    }
    public static String validIPAddress(String IP) {
        if (IP.contains(".")) {
            String[] ip = IP.split("\\.");
            if (ip.length != 4) {
                return "Neither";
            }
            for (String s : ip) {
                if (s.length() > 3 || s.length() == 0) {
                    return "Neither";
                }
                if (s.charAt(0) == '0' && s.length() > 1) {
                    return "Neither";
               }
            }
            for (String s : ip) {
                for (int i = 0; i < s.length(); i++) {
                    if (!(s.charAt(i) >= '0' && s.charAt(i) <= '9')) {
                        return "Neither";
                    }
                }
            }
            for (String s : ip) {
                int num = Integer.parseInt(s);
                if (num < 0 || num > 255) {
                    return "Neither";
                }
            }
            return "IPv4";
        }
        if (IP.contains(":")) {
            String[] ip = IP.split(":");
            if (ip.length != 8) {
                return "Neither";
            }
            for (String s : ip) {
                if (s.length() > 4 || s.length() == 0) {
                    return "Neither";
                }
            }
            for (String s : ip) {
                for (int i = 0; i < s.length(); i++) {
                    if (!((s.charAt(i) >= '0' && s.charAt(i) <= '9') || (s.charAt(i) >= 'a' && s.charAt(i) <= 'f') || (s.charAt(i) >= 'A' && s.charAt(i) <= 'F'))) {
                        return "Neither";
                    }
                }
            }
            return "IPv6";
        }
        return "Neither";
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.2626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值