news 2026/4/24 7:44:20

LeetCode 468 验证 IP 地址

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 468 验证 IP 地址


文章目录

    • 摘要
    • 描述
      • IPv4 的规则可以总结成一句话
      • IPv6 的规则则是
    • 题解答案
    • 题解代码分析
      • IPv4 校验逻辑拆解
      • IPv6 校验逻辑拆解
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 示例 3
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

《验证 IP 地址》是一道非常工程化的题

它不像很多算法题那样考复杂技巧,而是更像我们在写后台接口、网关校验、日志解析时,经常会遇到的那种“脏数据判断”问题。

这道题的核心不在算法,而在于三点:

  • 规则是否吃透
  • 边界是否考虑完整
  • 代码是否足够清晰、可维护

如果你平时写过参数校验、输入校验,这道题会让你有一种“这不就是我每天在干的事吗”的熟悉感。

描述

题目给你一个字符串queryIP,要求判断它属于哪一种类型:

  • 合法的 IPv4 → 返回"IPv4"
  • 合法的 IPv6 → 返回"IPv6"
  • 两者都不是 → 返回"Neither"

IPv4 的规则可以总结成一句话

x1.x2.x3.x4
  • 必须正好 4 段
  • 每段是 0~255 的十进制数字
  • 不能有前导零
  • 只能是数字,不能夹杂奇怪字符

IPv6 的规则则是

x1:x2:x3:x4:x5:x6:x7:x8
  • 必须正好 8 段
  • 每段 1~4 位
  • 只能是十六进制字符(0-9, a-f, A-F)
  • 允许前导零
  • 不支持::这种缩写(这是本题特别容易踩的坑)

题解答案

整体解法非常直接,也非常“工程化”:

  1. 先看分隔符

    • 包含.→ 尝试按 IPv4 规则解析
    • 包含:→ 尝试按 IPv6 规则解析
  2. 严格按规则逐段校验

  3. 任何一条不满足,直接判Neither

核心原则只有一个:
宁可判错为非法,也不能放过一个非法输入。

题解代码分析

下面是完整的 Swift 实现,结构清晰,逻辑拆分明确,可以直接运行。

classSolution{funcvalidIPAddress(_queryIP:String)->String{ifqueryIP.contains("."){returnisValidIPv4(queryIP)?"IPv4":"Neither"}ifqueryIP.contains(":"){returnisValidIPv6(queryIP)?"IPv6":"Neither"}return"Neither"}privatefuncisValidIPv4(_ip:String)->Bool{letparts=ip.split(separator:".",omittingEmptySubsequences:false)ifparts.count!=4{returnfalse}forpartinparts{// 不能为空ifpart.isEmpty{returnfalse}// 不能有前导零ifpart.count>1&&part.first=="0"{returnfalse}// 必须全是数字guardletnum=Int(part),num>=0&&num<=255else{returnfalse}}returntrue}privatefuncisValidIPv6(_ip:String)->Bool{letparts=ip.split(separator:":",omittingEmptySubsequences:false)ifparts.count!=8{returnfalse}forpartinparts{// 长度 1~4ifpart.isEmpty||part.count>4{returnfalse}forchinpart{if!ch.isHexDigit{returnfalse}}}returntrue}}

IPv4 校验逻辑拆解

letparts=ip.split(separator:".",omittingEmptySubsequences:false)

这里非常关键的一点是:
不能省略空字符串

否则像下面这种:

"192..168.1"

会被错误拆成 3 段。

ifpart.count>1&&part.first=="0"

这一步是专门防:

  • "01"
  • "001"

这是 IPv4 非常典型的坑点。

IPv6 校验逻辑拆解

IPv6 这边反而规则更“干净”:

  • 段数必须 8
  • 每段最多 4 位
  • 每个字符必须是十六进制

Swift 的这个 API 在这里非常好用:

ch.isHexDigit

可读性和安全性都比手写判断强。

示例测试及结果

示例 1

letsolution=Solution()print(solution.validIPAddress("172.16.254.1"))

输出:

IPv4

原因很简单:
4 段、范围合法、无前导零。

示例 2

print(solution.validIPAddress("2001:0db8:85a3:0:0:8A2E:0370:7334"))

输出:

IPv6

大小写混用、前导零,全都允许。

示例 3

print(solution.validIPAddress("256.256.256.256"))

输出:

Neither

单段数值超出 255,直接判非法。

时间复杂度

  • IPv4:最多检查 4 段
  • IPv6:最多检查 8 段,每段 4 个字符

整体时间复杂度:

O(n)

其中n是字符串长度,实际上非常小。

空间复杂度

只使用了拆分后的数组和少量变量:

O(1)

总结

《验证 IP 地址》这道题,非常不像“刷题”,但非常像“真实工作”

它真正考察的是:

  • 你能不能严格遵守规则
  • 你会不会遗漏边界
  • 你的代码是否清晰、可维护、可扩展
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:12:41

MCP 很火,来看看我们直接给后台管理系统上一个 MCP?

一、什么是 MCP 引用一些官方的介绍吧&#xff1a; Model Context Protocol (MCP) 是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互&#xff0c;还是构建自定义的 AI 工作流&#xff0c;MCP 提…

作者头像 李华
网站建设 2026/4/23 14:49:21

命令替换(Command Substitution)详解

命令替换&#xff08;Command Substitution&#xff09;详解 &#x1f3af; 一句话概括 命令替换 把一个命令的输出作为另一个命令的参数或变量值。这是Shell编程中最强大、最常用的功能之一&#xff01; &#x1f4a1; 核心概念 基本语法 # 两种语法都有效 command # 反引…

作者头像 李华
网站建设 2026/4/22 20:51:25

[特殊字符] Pathway:高效的Python ETL框架,助力实时数据处理与分析

Pathway 实时数据处理框架介绍 在当今数据驱动的时代&#xff0c;能够有效处理实时数据流与批量数据的工具愈加重要。Pathway是一个用于流处理、实时分析、LLM&#xff08;大语言模型&#xff09;管道和RAG&#xff08;实时生成&#xff09;应用的Python ETL框架。它为用户提供…

作者头像 李华
网站建设 2026/4/24 2:00:08

高德扫街榜2026发布:首个全季节、全品类、全人群和全球化的真实榜单

2026年1月7日&#xff0c;阿里巴巴集团旗下高德正式发布高德扫街榜2026——在原有的“真实”核心理念基础上&#xff0c;围绕数字、信任与科技三大核心力量全面升级&#xff0c;发布了飞行街景、时令榜单、AR实景、好友动态等一系列新功能&#xff0c;推动生活服务榜单进入“比…

作者头像 李华
网站建设 2026/4/23 16:46:30

6.1 Elasticsearch-Lucene 索引文件结构:tim、tip、doc、pos、pay

6.1 Elasticsearch-Lucene 索引文件结构&#xff1a;tim、tip、doc、pos、pay Elasticsearch 的搜索性能之所以能在 PB 级别数据量下仍保持毫秒级响应&#xff0c;核心依赖是 Lucene 的倒排索引文件格式。一个分片&#xff08;shard&#xff09;本质上就是 Lucene 的一个索引目…

作者头像 李华