2026/5/21 1:27:07
网站建设
项目流程
织梦免费购物网站,风铃微网站怎么做,罗定市城乡建设局网站,泰兴做网站公司文章目录摘要描述IPv4 的规则可以总结成一句话IPv6 的规则则是题解答案题解代码分析IPv4 校验逻辑拆解IPv6 校验逻辑拆解示例测试及结果示例 1示例 2示例 3时间复杂度空间复杂度总结摘要
《验证 IP 地址》是一道非常工程化的题。
它不像很多算法题那样考复杂技巧#xff0c;…文章目录摘要描述IPv4 的规则可以总结成一句话IPv6 的规则则是题解答案题解代码分析IPv4 校验逻辑拆解IPv6 校验逻辑拆解示例测试及结果示例 1示例 2示例 3时间复杂度空间复杂度总结摘要《验证 IP 地址》是一道非常工程化的题。它不像很多算法题那样考复杂技巧而是更像我们在写后台接口、网关校验、日志解析时经常会遇到的那种“脏数据判断”问题。这道题的核心不在算法而在于三点规则是否吃透边界是否考虑完整代码是否足够清晰、可维护如果你平时写过参数校验、输入校验这道题会让你有一种“这不就是我每天在干的事吗”的熟悉感。描述题目给你一个字符串queryIP要求判断它属于哪一种类型合法的 IPv4 → 返回IPv4合法的 IPv6 → 返回IPv6两者都不是 → 返回NeitherIPv4 的规则可以总结成一句话x1.x2.x3.x4必须正好 4 段每段是 0255 的十进制数字不能有前导零只能是数字不能夹杂奇怪字符IPv6 的规则则是x1:x2:x3:x4:x5:x6:x7:x8必须正好 8 段每段 14 位只能是十六进制字符0-9, a-f, A-F允许前导零不支持::这种缩写这是本题特别容易踩的坑题解答案整体解法非常直接也非常“工程化”先看分隔符包含.→ 尝试按 IPv4 规则解析包含:→ 尝试按 IPv6 规则解析严格按规则逐段校验任何一条不满足直接判Neither核心原则只有一个宁可判错为非法也不能放过一个非法输入。题解代码分析下面是完整的 Swift 实现结构清晰逻辑拆分明确可以直接运行。classSolution{funcvalidIPAddress(_queryIP:String)-String{ifqueryIP.contains(.){returnisValidIPv4(queryIP)?IPv4:Neither}ifqueryIP.contains(:){returnisValidIPv6(queryIP)?IPv6:Neither}returnNeither}privatefuncisValidIPv4(_ip:String)-Bool{letpartsip.split(separator:.,omittingEmptySubsequences:false)ifparts.count!4{returnfalse}forpartinparts{// 不能为空ifpart.isEmpty{returnfalse}// 不能有前导零ifpart.count1part.first0{returnfalse}// 必须全是数字guardletnumInt(part),num0num255else{returnfalse}}returntrue}privatefuncisValidIPv6(_ip:String)-Bool{letpartsip.split(separator::,omittingEmptySubsequences:false)ifparts.count!8{returnfalse}forpartinparts{// 长度 1~4ifpart.isEmpty||part.count4{returnfalse}forchinpart{if!ch.isHexDigit{returnfalse}}}returntrue}}IPv4 校验逻辑拆解letpartsip.split(separator:.,omittingEmptySubsequences:false)这里非常关键的一点是不能省略空字符串否则像下面这种192..168.1会被错误拆成 3 段。ifpart.count1part.first0这一步是专门防01001这是 IPv4 非常典型的坑点。IPv6 校验逻辑拆解IPv6 这边反而规则更“干净”段数必须 8每段最多 4 位每个字符必须是十六进制Swift 的这个 API 在这里非常好用ch.isHexDigit可读性和安全性都比手写判断强。示例测试及结果示例 1letsolutionSolution()print(solution.validIPAddress(172.16.254.1))输出IPv4原因很简单4 段、范围合法、无前导零。示例 2print(solution.validIPAddress(2001:0db8:85a3:0:0:8A2E:0370:7334))输出IPv6大小写混用、前导零全都允许。示例 3print(solution.validIPAddress(256.256.256.256))输出Neither单段数值超出 255直接判非法。时间复杂度IPv4最多检查 4 段IPv6最多检查 8 段每段 4 个字符整体时间复杂度O(n)其中n是字符串长度实际上非常小。空间复杂度只使用了拆分后的数组和少量变量O(1)总结《验证 IP 地址》这道题非常不像“刷题”但非常像“真实工作”。它真正考察的是你能不能严格遵守规则你会不会遗漏边界你的代码是否清晰、可维护、可扩展