LeetCode 题解工作台

验证IP地址

给定一个字符串 queryIP 。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。 有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 i 且 x i 不能…

category

1

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

中等 · String-driven solution strategy

bolt

答案摘要

我们可以定义两个函数 `isIPv4` 和 `isIPv6` 来判断一个字符串是否是有效的 IPv4 地址和 IPv6 地址。 函数 `isIPv4` 的实现如下:

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 String-driven solution strategy 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

解题思路

方法一:模拟

我们可以定义两个函数 isIPv4isIPv6 来判断一个字符串是否是有效的 IPv4 地址和 IPv6 地址。

函数 isIPv4 的实现如下:

  1. 我们首先判断字符串 s 是否以 . 结尾,如果是的话,说明 s 不是一个有效的 IPv4 地址,直接返回 false
  2. 然后我们将字符串 s. 分割成一个字符串数组 ss,如果 ss 的长度不等于 4,说明 s 不是一个有效的 IPv4 地址,直接返回 false
  3. 对于数组 ss 中的每个字符串 t,我们判断:
    • 如果 t 的长度大于 1t 的第一个字符是 0,说明 t 不是一个有效的 IPv4 地址,直接返回 false
    • 如果 t 不是一个数字或者 t 不在 0255 的范围内,说明 t 不是一个有效的 IPv4 地址,直接返回 false
  4. 如果上述条件都不满足,说明 s 是一个有效的 IPv4 地址,返回 true

函数 isIPv6 的实现如下:

  1. 我们首先判断字符串 s 是否以 : 结尾,如果是的话,说明 s 不是一个有效的 IPv6 地址,直接返回 false
  2. 然后我们将字符串 s: 分割成一个字符串数组 ss,如果 ss 的长度不等于 8,说明 s 不是一个有效的 IPv6 地址,直接返回 false
  3. 对于数组 ss 中的每个字符串 t,我们判断:
    • 如果 t 的长度小于 1 或大于 4,说明 t 不是一个有效的 IPv6 地址,直接返回 false
    • 如果 t 中的字符不全是 09af(不区分大小写),说明 t 不是一个有效的 IPv6 地址,直接返回 false
  4. 如果上述条件都不满足,说明 s 是一个有效的 IPv6 地址,返回 true

最后,我们调用 isIPv4isIPv6 函数判断 queryIP 是不是一个有效的 IPv4 地址或 IPv6 地址,如果都不是,返回 Neither

时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)。其中 nn 为字符串 queryIP 的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution:
    def validIPAddress(self, queryIP: str) -> str:
        def is_ipv4(s: str) -> bool:
            ss = s.split(".")
            if len(ss) != 4:
                return False
            for t in ss:
                if len(t) > 1 and t[0] == "0":
                    return False
                if not t.isdigit() or not 0 <= int(t) <= 255:
                    return False
            return True

        def is_ipv6(s: str) -> bool:
            ss = s.split(":")
            if len(ss) != 8:
                return False
            for t in ss:
                if not 1 <= len(t) <= 4:
                    return False
                if not all(c in "0123456789abcdefABCDEF" for c in t):
                    return False
            return True

        if is_ipv4(queryIP):
            return "IPv4"
        if is_ipv6(queryIP):
            return "IPv6"
        return "Neither"
speed

复杂度分析

指标
时间complexity is (\mathcal{O}(N)) since each character of the string is examined once. Space complexity is (\mathcal{O}(1)) ignoring the split segments array, as only fixed-size checks are used per segment.
空间\mathcal{O}(1)
psychology

面试官常问的追问

外企场景
  • question_mark

    Expect clear string parsing and segment-by-segment validation.

  • question_mark

    Watch for handling of leading zeros and range violations in IPv4 segments.

  • question_mark

    Look for proper hexadecimal checks and correct segment count in IPv6 addresses.

warning

常见陷阱

外企场景
  • error

    Allowing leading zeros in IPv4 segments, e.g., '01' incorrectly accepted.

  • error

    Failing to check that each IPv6 segment has at most four hexadecimal digits.

  • error

    Mixing IPv4 and IPv6 separators, or miscounting the number of segments.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Validate only IPv4 addresses, skipping IPv6 checks.

  • arrow_right_alt

    Validate only IPv6 addresses, skipping IPv4 checks.

  • arrow_right_alt

    Detect shorthand IPv6 formats with omitted zeros, extending the standard rules.

help

常见问题

外企场景

验证IP地址题解:String-driven solution … | LeetCode #468 中等