★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10346244.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Write a function to check whether an input string is a valid IPv4 address or IPv6 address or neither.

IPv4 addresses are canonically represented in dot-decimal notation, which consists of four decimal numbers, each ranging from 0 to 255, separated by dots ("."), e.g.,172.16.254.1;

Besides, leading zeros in the IPv4 is invalid. For example, the address 172.16.254.01 is invalid.

IPv6 addresses are represented as eight groups of four hexadecimal digits, each group representing 16 bits. The groups are separated by colons (":"). For example, the address 2001:0db8:85a3:0000:0000:8a2e:0370:7334 is a valid one. Also, we could omit some leading zeros among four hexadecimal digits and some low-case characters in the address to upper-case ones, so 2001:db8:85a3:0:0:8A2E:0370:7334 is also a valid IPv6 address(Omit leading zeros and using upper cases).

However, we don't replace a consecutive group of zero value with a single empty group using two consecutive colons (::) to pursue simplicity. For example, 2001:0db8:85a3::8A2E:0370:7334 is an invalid IPv6 address.

Besides, extra leading zeros in the IPv6 is also invalid. For example, the address 02001:0db8:85a3:0000:0000:8a2e:0370:7334 is invalid.

Note: You may assume there is no extra space or special characters in the input string.

Example 1:

Input: "172.16.254.1"Output: "IPv4"Explanation: This is a valid IPv4 address, return "IPv4". 

Example 2:

Input: "2001:0db8:85a3:0:0:8A2E:0370:7334"Output: "IPv6"Explanation: This is a valid IPv6 address, return "IPv6". 

Example 3:

Input: "256.256.256.256"Output: "Neither"Explanation: This is neither a IPv4 address nor a IPv6 address.

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1

同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。

IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。

然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334是无效的 IPv6 地址。

同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

示例 1:

输入: "172.16.254.1"输出: "IPv4"解释: 这是一个有效的 IPv4 地址, 所以返回 "IPv4"。

示例 2:

输入: "2001:0db8:85a3:0:0:8A2E:0370:7334"输出: "IPv6"解释: 这是一个有效的 IPv6 地址, 所以返回 "IPv6"。

示例 3:

输入: "256.256.256.256"输出: "Neither"解释: 这个地址既不是 IPv4 也不是 IPv6 地址。

12ms
 1 class Solution {
 2     func validIPAddress(_ IP: String) -> String {
 3         if isValidIPv4(IP) {return "IPv4"}
 4         else if isValidIPv6(IP) {return "IPv6"}
 5         else
 6         {
 7             return "Neither"
 8         }
 9     }
10
11     func isValidIPv4(_ ip:String) -> Bool
12     {
13         if ip.count < 7 {return false}
14         if ip[0] == "." {return false}
15         if ip[ip.count-1] == "." {return false}
16         var tokens:[String] = ip.components(separatedBy:".")
17         if tokens.count != 4  {return false}
18         for token in tokens
19         {
20             if !isValidIPv4Token(token) {return false}
21         }
22         return true
23     }
24
25     func isValidIPv4Token(_ token:String) -> Bool
26     {
27         if token.hasPrefix("0") && token.count > 1 {return false}
28
29         if let parsedInt = Int(token)
30         {
31             if parsedInt < 0 || parsedInt > 255 {return false}
32             if parsedInt==0 && token[0] != "0" {return false}
33             return true
34         }
35         else
36         {
37             return false
38         }
39     }
40
41     func isValidIPv6(_ ip:String) -> Bool
42     {
43         if ip.count < 15 {return false}
44         if ip[0] == ":" {return false}
45         if ip[ip.count-1] == ":" {return false}
46         var tokens:[String] = ip.components(separatedBy:":")
47         if tokens.count != 8  {return false}
48         for token in tokens
49         {
50             if !isValidIPv6Token(token) {return false}
51         }
52         return true
53     }
54
55         func isValidIPv6Token(_ token:String) -> Bool
56     {
57         if token.count == 0 || token.count > 4 {return false}
58         for c in token.characters
59         {
60             var isDigit:Bool = c.ascii >= 48 && c.ascii <= 57
61             var isUppercaseAF:Bool = c.ascii >= 65 && c.ascii <= 70
62             var isLowerCaseAF:Bool = c.ascii >= 97 && c.ascii <= 102
63             if !(isDigit || isUppercaseAF || isLowerCaseAF)
64             {
65                 return false
66             }
67         }
68         return true
69     }
70 }
71
72 extension String {
73     //subscript函数可以检索数组中的值
74     //直接按照索引方式截取指定索引的字符
75     subscript (_ i: Int) -> Character {
76         //读取字符
77         get {return self[index(startIndex, offsetBy: i)]}
78     }
79 }
80
81 extension Character
82 {
83   //属性:ASCII整数值(定义小写为整数值)
84    var ascii: Int {
85         get {
86             let s = String(self).unicodeScalars
87             return Int(s[s.startIndex].value)
88         }
89     }
90 }


12ms

 1 class Solution {
 2     func validIPAddress(_ IP: String) -> String {
 3
 4         let ipv4 = IP.components(separatedBy: ".")
 5
 6         if ipv4.count == 4 {
 7
 8             return validIPv4Adress(ipv4)
 9         }
10
11         let ipv6 = IP.components(separatedBy: ":")
12
13         if ipv6.count == 8 {
14
15             return validIPv6Adress(ipv6)
16         }
17
18         return "Neither"
19     }
20
21     /// IP v4 检验
22     private func validIPv4Adress(_ ips: [String]) -> String{
23
24         for ip in ips {
25
26             if !ip.isValidIPv4() {
27                 return "Neither"
28             }
29         }
30
31         return "IPv4"
32     }
33
34
35     /// IP v6 检验
36     private func validIPv6Adress(_ ips: [String]) -> String{
37
38         for ip in ips {
39
40             if !ip.isValidIPv6() {
41                 return "Neither"
42             }
43         }
44
45         return "IPv6"
46     }
47 }
48
49 extension String{
50
51     func isValidIPv4() -> Bool{
52
53         /// 不可前缀 0
54         if self.count > 1 && self.hasPrefix("0") { return false }
55
56         guard let ip = UInt(self) else { return false }
57
58         if ip == 0 && self.contains("-") { return false }
59
60         return ip <= 255
61     }
62
63     func isValidIPv6() -> Bool{
64
65         if self.count > 4 { return false }
66
67         guard let ip = UInt(self, radix: 16) else { return false }
68
69         if ip == 0 && self.contains("-") { return false }
70
71         return true
72     }
73 }

转载于:https://www.cnblogs.com/strengthen/p/10346244.html

[Swift]LeetCode468. 验证IP地址 | Validate IP Address相关推荐

  1. 71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

    目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 IP 协议又是最重要的协议之一.IP 协议是基于  ...

  2. 71张图详解IP地址、IP 路由、三层转发、ARP、ICMP

    71张图详解IP地址.IP 路由.三层转发.ARP.ICMP 架构师之道2021-04-07 13:51:24 https://www.toutiao.com/i6948285918986027531 ...

  3. 【最全面的】71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

    转发自: Original Fox 网络技术平台 目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 ...

  4. ipv4广播地址怎么填_什么是IP地址?IP地址有什么用?网络工程师来告诉你

    大家好,我是专注于网络技术分享的网络工程师陈锋,今天我们来聊一下IP,IP地址这么简单还有什么可聊的,不要觉得很简单,IP是整个TCP/IP协议族的核心,也是构成互联网的基础. 图片来源于网络 IP地 ...

  5. 【OS】Linux环境下配置固定IP地址--静态IP地址(不能上外网问题)

    [OS]Linux环境下配置固定IP地址--静态IP地址(不能上外网问题) ---red hat重启网卡 service network restart /etc/rc.d/init.d/networ ...

  6. IP地址分类/IP地址10开头和172开头和192开头的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段 简单来说在公司或企业 ...

  7. ip地址简介 ip地址取值0-255 最后一位也可以为0

    IPv4由32位二进制组成,平均分为4段,每段8位,中间用点隔开,用十进制表示,称为点分十进制.(每段的范围都是0-255) 一.IP地址和MAC地址 1.MAC地址 MAC(Media Access ...

  8. IP地址概述——IP地址1.1.1

    IP地址组成 IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址. IP是一种网络上的逻辑地址,与之对应的还有MAC物理地址.逻辑相关的就是软件层面上 ...

  9. 【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★

    文章目录 一.IP 地址 发展 二.分类 IP 地址 三.特殊 IP 地址 四.私有 IP 地址 五.分类 IP 地址 网络号 主机数 详情 一.IP 地址 发展 IP 地址 发展 : 第一阶段 : ...

最新文章

  1. 三大测序平台芯片通量对比图
  2. 使用pytorch构建2D和3D人脸比对库(使用face-alignment)
  3. matlab绘制y3=e (-x),MATLAB图形绘制-二维配套实验
  4. ubuntu将GNU nano换成vim
  5. JAVA中 fastjson两个JSONArray叠加,合并 ,方法 addAll()
  6. MAC下安装与配置MySQL [转]
  7. 使用C语言进行面向对象的开发--GObject入门[7]
  8. /etc/mtab is not writable
  9. 【单片机基础篇】51单片机流水灯
  10. dreamweaver cc php mysql_Dreamweaver cc 2015 +PHP+MySQL动态网站开发案例教程集合
  11. 编程为什么有趣?浅谈编程的快乐。
  12. 怎么将抖音上的多个视频合成一个视频
  13. 能源预测:回顾与展望(IEEE论文)
  14. Mac版 微信 撤回消息拦截两种方法
  15. 技术选型Rust——事后分析
  16. Python 3 《dictionary》入门练习
  17. 360极速浏览器屏蔽百度广告
  18. 全键盘 掌上 linux,拥有QWERTY打字体验手机秒变掌上电脑 OPPO全键盘保护壳专利曝光...
  19. 2020移动apn接入点哪个快_为什么别人的4g网总比你快? 手机这个设置没开启, 难怪网络...
  20. AWVS扫描Web应用程序

热门文章

  1. [Linux]阿里云免费试用体验(在阿里云的ubuntu上部署个人服务)
  2. ASP 代码给 ASP 页加密码保护
  3. 我作为开发者犯过的两次愚蠢的错误
  4. Java线程详解(13)-锁
  5. map:map指向最后一个元素?指向第一个元素?
  6. 【Python】青少年蓝桥杯_每日一题_5.15_打印 99 乘法表
  7. org.hibernate.transientobjectexception:The given object has a null identifier: com.gxuwz.check.entit
  8. 一台台式计算机的主要配件有哪些,电脑的基本配件有哪些
  9. c语言cin n1 n2,牛客等级之题N1 追债之旅 - N2 Rinne Loves Study(8.6场)
  10. mybatisplus or查询_MybatisPlus的各种查询方式