首页 > 其他分享 >LeetCode题练习与总结:验证 IP 地址--468

LeetCode题练习与总结:验证 IP 地址--468

时间:2024-12-15 19:31:12浏览次数:6  
标签:queryIP 468 -- IP 复杂度 地址 IPv4 IPv6 字符串

一、题目描述

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

二、解题思路

  • 首先,我们可以通过检查字符串中是否包含字符 ‘.’ 或 ‘:’ 来判断它是 IPv4 还是 IPv6 地址。
  • 对于 IPv4 地址:
    • 使用 ‘.’ 分割字符串,检查分割后的数组长度是否为 4。
    • 对于每个分割后的字符串,检查是否在 0 到 255 之间,且没有前导零(除非字符串就是 “0”)。
  • 对于 IPv6 地址:
    • 使用 ‘:’ 分割字符串,检查分割后的数组长度是否为 8。
    • 对于每个分割后的字符串,检查长度是否在 1 到 4 之间,且只包含十六进制字符。
  • 如果都不满足,则返回 “Neither”。

三、具体代码

class Solution {
    public String validIPAddress(String queryIP) {
        if (queryIP.contains(".")) {
            return validateIPv4(queryIP) ? "IPv4" : "Neither";
        } else if (queryIP.contains(":")) {
            return validateIPv6(queryIP) ? "IPv6" : "Neither";
        } else {
            return "Neither";
        }
    }

    private boolean validateIPv4(String ip) {
        String[] parts = ip.split("\\.", -1);
        if (parts.length != 4) return false;
        for (String part : parts) {
            if (!part.matches("0|[1-9][0-9]{0,2}")) return false;
            if (part.length() > 1 && part.startsWith("0")) return false;
            if (Integer.parseInt(part) > 255) return false;
        }
        return true;
    }

    private boolean validateIPv6(String ip) {
        String[] parts = ip.split(":", -1);
        if (parts.length != 8) return false;
        for (String part : parts) {
            if (!part.matches("[0-9a-fA-F]{1,4}")) return false;
        }
        return true;
    }
}

在这段代码中,我们使用了正则表达式来验证 IPv4 和 IPv6 地址的各个部分。对于 IPv4,我们检查每个部分是否是 0 到 255 之间的数字,且没有前导零(除非部分是 “0”)。对于 IPv6,我们检查每个部分是否只包含 1 到 4 个十六进制字符。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • validateIPv4 方法

    • split("\\.", -1):这个操作会遍历整个字符串 queryIP 一次,所以时间复杂度是 O(n),其中 n 是 queryIP 的长度。
    • parts.length != 4:这是一个常数时间操作,时间复杂度是 O(1)。
    • 循环遍历 parts 数组:这个循环会执行 4 次(因为有效的 IPv4 地址有 4 个部分),所以时间复杂度是 O(1)。
      • part.matches("0|[1-9][0-9]{0,2}"):这是一个正则表达式匹配操作,时间复杂度取决于正则表达式的复杂度,但由于正则表达式固定且简单,可以认为它是 O(1)。
      • part.startsWith("0"):这是一个常数时间操作,时间复杂度是 O(1)。
      • Integer.parseInt(part) > 255:这是一个常数时间操作,时间复杂度是 O(1)。
    • 综合以上,validateIPv4 方法的时间复杂度是 O(n)。
  • validateIPv6 方法

    • split(":", -1):这个操作会遍历整个字符串 queryIP 一次,所以时间复杂度是 O(n),其中 n 是 queryIP 的长度。
    • parts.length != 8:这是一个常数时间操作,时间复杂度是 O(1)。
    • 循环遍历 parts 数组:这个循环会执行 8 次(因为有效的 IPv6 地址有 8 个部分),所以时间复杂度是 O(1)。
      • part.matches("[0-9a-fA-F]{1,4}"):这是一个正则表达式匹配操作,时间复杂度同样是 O(1)。
    • 综合以上,validateIPv6 方法的时间复杂度也是 O(n)。
2. 空间复杂度
  • validateIPv4 方法

    • parts 数组:这个数组固定有 4 个元素,所以空间复杂度是 O(1)。
  • validateIPv6 方法

    • parts 数组:这个数组固定有 8 个元素,所以空间复杂度是 O(1)。

综上所述,整体的时间复杂度是 O(n),空间复杂度是 O(1)。这里的空间复杂度只考虑了额外的空间使用,没有考虑输入字符串 queryIP 本身占用的空间。

五、总结知识点

  • 字符串操作

    • contains(String str): 检查字符串是否包含指定的子字符串。
    • split(String regex, int limit): 根据匹配给定的正则表达式来拆分字符串,并限定拆分次数。
  • 正则表达式

    • matches(String regex): 告知这个字符串是否匹配给定的正则表达式。
    • 正则表达式的基本用法,如字符类(. 表示任意字符,[0-9] 表示数字,[a-fA-F] 表示十六进制字符)和量词({0,2} 表示匹配前面的字符 0 到 2 次)。
  • 条件判断

    • if-else 语句:用于根据条件执行不同的代码块。
  • 字符串与整数的转换

    • Integer.parseInt(String s): 将字符串参数解析为带符号的整数。
  • 字符串方法

    • startsWith(String prefix): 检查字符串是否以指定的前缀开始。
  • 数组操作

    • 数组的声明和使用。
    • 使用增强型 for 循环遍历数组。
  • 方法重载

    • 在同一个类中定义了两个同名的 validateIPvX 方法,但参数类型不同,这是方法重载的一个例子。
  • 返回值

    • 方法返回布尔值以表示条件是否满足。
    • 方法返回字符串以表示 IP 地址的类型。
  • 面向对象编程

    • 使用私有方法 validateIPv4 和 validateIPv6 来封装验证逻辑,体现了封装的原则。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:queryIP,468,--,IP,复杂度,地址,IPv4,IPv6,字符串
From: https://blog.csdn.net/weixin_62860386/article/details/144478041

相关文章

  • HarmonyOS Next 实战卡片开发 02
    HarmonyOSNext实战卡片开发02卡片开发中,还有一个难点是显示图片。其中分为显示本地图片和显示网络图片显示本地图片卡片可以显示本地图片,如存放在应用临时目录下的图片。路径比如/data/app/el2/100/base/你的项目boundleName/temp/123.png以下操作是为了得到一张该目......
  • LeetCode题练习与总结:用 Rand7() 实现 Rand10() -- 470
    一、题目描述给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。每个测试用例将有一个内部参数 n,即你实现的函数 rand......
  • AI即时直播换脸换声技术解析与应用前景
    文中插图下面有实验场,可以亲自体验AI的强大之处!AI在多个领域的应用场景不断扩展,尤其是在娱乐、社交媒体以及直播行业。AI即时直播换脸与换声,作为这一波AI技术革新的代表性应用,不仅在技术上实现了巨大的突破,也带来了前所未有的创作自由。然而,这项技术的出现也引发了广泛的讨论,......
  • AI数字人(无人)直播:技术架构与未来展望
    文中配图下面有实验场,可以亲自体验一把AI数字人的强大!近年来,随着人工智能技术的迅猛发展,AI数字人(DigitalHuman)逐渐成为了直播行业的新兴力量。AI数字人直播不仅能够模拟人类行为、声音和情感反应,还能在虚拟环境中进行高度交互,吸引了广泛的关注与投资。本文将深入探讨AI数字人......
  • 如何在 Ubuntu 22.04 上使用 vnStat 监控网络流量
    简介vnStat是一个免费的、开源的、基于控制台的Linux操作系统网络流量监控工具。通过vnStat,你可以在不同的时间段监控网络统计数据。它简单、轻量级,并且消耗的系统资源很小。vnStat允许你按小时、日、月、周和日生成网络流量数据。本教程将向你展示如何在Ubuntu22.04上安......
  • web前端期末大作业:基于HTML+CSS+JavaScript制作我的音乐网站(带设计报告)
    ......
  • Qt之热键盘使用(八)
    Qt开发 系列文章-Hot-keyboard(八)目录前言一、键盘使用二、QKeyEvent按键事件1.使用QShortcut类2.重写keyPressEvent三、QxtGlobalShortcut库四、QHotkey库总结前言Qt实现热键盘/快捷键的使用,比较直接简单的是利用Qt自带的QShortcut类、QKeyEvent类,通过改写相关......
  • Pta|找鞍点
    一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。本题要求编写程序,求一个给定的n阶方阵的鞍点。输入格式:输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。输出格式:输出在一行中按照“行下标列下标”(下标从0开始)的格式......
  • DP协议:概括
    来了来了!!!开始之前扯点概念,知道DP好在哪里,以及看到它的发展趋势,才知道我们为什么有学习的必要。DP的优势DisplayPort(DP)协议作为一种专为数字音频和视频传输设计的高速串行接口标准,在现代显示技术和多媒体应用中扮演着至关重要的角色。它由视频电子标准协会(VESA)这一权......
  • DP协议:缩略词
    缩写代表的含义ACT分配更改触发(AllocationChangeTrigger)API应用程序编程接口(ApplicationProgrammingInterface)AUX辅助(Auxiliary)BER比特错误率(BitErrorRate)bpc每色比特数(BitsPerComponent)bpp每像素比特数(BitsPerPixel)BE消隐结束(BlankingEnd)BS消隐开始(BlankingSta......