返回

对 LeetCode 468 问题进行全面剖析:验证 IP 地址

前端

问题陈述

给定一个字符串 queryIP,您的任务是确定它是否表示一个有效的 IP 地址。IP 地址可以是 IPv4 或 IPv6 格式。

IPv4 地址由四部分组成,每部分都是一个介于 0 到 255 之间的数字,由点号分隔。例如:

192.168.1.1

IPv6 地址由八部分组成,每部分都是一个由冒号分隔的四位十六进制数。例如:

2001:0db8:85a3:08d3:1319:8a2e:0370:7334

解决方法

要验证 IP 地址,我们可以遵循以下步骤:

  1. 确定 IP 地址的类型:

    • 如果 queryIP 包含点号,则它是一个 IPv4 地址。
    • 否则,如果 queryIP 包含冒号,则它是一个 IPv6 地址。
  2. IPv4 验证:

    • queryIP 拆分为四部分。
    • 对于每个部分:
      • 检查它是否是一个介于 0 到 255 之间的整数。
      • 检查它是否不以 0 开头(除非它是 0 本身)。
  3. IPv6 验证:

    • queryIP 拆分为八部分。
    • 对于每个部分:
      • 检查它是否是长度为 1 到 4 的十六进制数。
      • 检查它是否不以 0 开头(除非它是 0 本身)。

如果所有部分都通过验证,则 queryIP 是一个有效的 IP 地址。否则,它不是一个有效的 IP 地址。

Python 实现

以下是一个 Python 函数来验证 IP 地址:

def is_valid_ip_address(query_ip):
  """
  验证一个字符串是否表示一个有效的 IP 地址。

  参数:
    query_ip (str): 要验证的字符串。

  返回:
    bool: `True` 如果 `query_ip` 是一个有效的 IP 地址,否则为 `False`。
  """

  # 确定 IP 地址的类型
  if '.' in query_ip:
    ip_type = 'IPv4'
  elif ':' in query_ip:
    ip_type = 'IPv6'
  else:
    return False

  # IPv4 验证
  if ip_type == 'IPv4':
    parts = query_ip.split('.')
    if len(parts) != 4:
      return False
    for part in parts:
      try:
        int_part = int(part)
        if not (0 <= int_part <= 255) or (int_part == 0 and len(part) > 1):
          return False
      except ValueError:
        return False

  # IPv6 验证
  elif ip_type == 'IPv6':
    parts = query_ip.split(':')
    if len(parts) != 8:
      return False
    for part in parts:
      if not (1 <= len(part) <= 4):
        return False
      try:
        int_part = int(part, 16)
        if not (0 <= int_part <= 65535) or (int_part == 0 and len(part) > 1):
          return False
      except ValueError:
        return False

  # 所有部分都通过验证
  return True

总结

验证 IP 地址是 LeetCode 中一个常见的问题。通过理解 IP 地址的语法并遵循上述步骤,您可以有效地解决此问题。我们提供的 Python 实现提供了上述算法的清晰且可复用的实现。通过练习和应用本文中介绍的技术,您可以提高解决此类问题的技能,并推进您的编程之旅。