当前位置: 首页 > news >正文

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 地址》这道题,非常不像“刷题”,但非常像“真实工作”

它真正考察的是:

  • 你能不能严格遵守规则
  • 你会不会遗漏边界
  • 你的代码是否清晰、可维护、可扩展
http://www.jsqmd.com/news/211735/

相关文章:

  • DeepSeek对于DuckDB on LoongArch一文的总结
  • 状态管理:Flutter 为什么走上了和前端一样的“百家争鸣”?
  • 学长亲荐2026自考AI论文工具TOP10:选对工具轻松过关
  • Springboot品牌购物官网rmu1i本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 一文看懂 NVIDIA 平台全栈:从 CUDA 到 Jetson / DRIVE / Isaac 的当下走向
  • 群体智能 AI Agent:多个 LLM 协作的分布式系统
  • nums.sort()和nums.sort((a, b) => a - b)
  • 吐血推荐10个AI论文网站,自考本科论文格式规范必备!
  • Springboot劳务派遣人事系统gjfr3(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 大数据领域数据安全防护的最佳实践分享
  • 分页(Paging)完全解析
  • 分页(Paging)完全解析
  • MCP 很火,来看看我们直接给后台管理系统上一个 MCP?
  • 大数据领域Doris与MongoDB的集成方案
  • 美团Java后端Java面试被问:Kafka的零拷贝技术和PageCache优化
  • 导师严选10个AI论文写作软件,专科生轻松搞定毕业论文!
  • HeiXi 配置 Metahuman
  • 导师严选10个一键生成论文工具,本科生毕业论文必备!
  • 高德扫街榜2026发布:首个全季节、全品类、全人群和全球化的真实榜单
  • The following modules are missing or built with a different engine version:
  • 命令替换(Command Substitution)详解
  • 优雅阅读实时热闻,畅享新闻新体验✨
  • [特殊字符] Pathway:高效的Python ETL框架,助力实时数据处理与分析
  • 星空计划亮相2026年CES,全球化战略进程加速
  • MybatisPlus-快速入门
  • 高德扫街榜100天全新升级:从美食到吃喝玩乐,全球首次实现飞行实景探店
  • 论文67分神话创造者:7000篇论文实战淬炼,金老师带你锁定2026年高项通关“生死关”
  • 2026年入局AI行业:普通人的机会在哪里?
  • 操作系统期末复习——第5章:输入/输出
  • Claude Code 国内使用2026年最新完整教程分享