[Swift]LeetCode468. 验证IP地址 | Validate IP Address

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

时间: 2024-11-07 13:07:53

[Swift]LeetCode468. 验证IP地址 | Validate IP Address的相关文章

python之IP地址或IP段处理模块-ipaddr

python处理IP和IP段的模块基本有两个:IPy与ipaddr IPy基本处理8位.16位.24位掩码的网段,其他的网段处理起来就会出现问题. ipaddr是google出的一个模块,很好的可以处理模块IPy不能解决这个问题,所以建议使用模块ipaddr! 模块地址:http://pythonhosted.org/ipaddr/ 使用介绍: Class总共分为:BaseIP.IPv4.IPv6 ipaddr.IPv4Network()    ipv4网段对象建立 ipaddr.IPv6Net

思科交换机 查看某个端口下的IP地址 及 IP查交换机端口

交换机端口 查IP地址 1.进入交换机特权模式  查 F0/10 端口的 MAC地址 #:show mac-address-table interface F0/17 Mac Address Table ------------------------------------------- Vlan    Mac Address       Type        Ports ----    -----------       --------    ----- 200    2857.be99

获取ip地址&amp;&amp;测试ip地址

# request# 动态页面加载 Selenium# request# 响应类型为 json# import json # json.loads(str) # 将str转化为dict# json.dumps(dict) # 将dict转化为 str #获取ip地址开始import requestsfrom fake_useragent import UserAgent #代理from lxml.etree import HTML #获取htmlimport time,pickle #包#常见的

[Swift]LeetCode93. 复原IP地址 | Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations. Example: Input: "25525511135" Output: ["255.255.11.135", "255.255.111.35"] 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入:

题目1203:IP地址-----------------把IP地址当成四个数字来输入就简单了很多

#include<stdio.h> int main() { int n; while(scanf("%d",&n)!=EOF) { while(n--) { int a,b,c,d; scanf("%d.%d.%d.%d",&a,&b,&c,&d); if ((a>-1 && a<256)&&(b>-1 && b<256)&&

JS中IP地址的相关验证

/* ***************** */ /* 判断IP地址是否合法 */ var judgeIpIsLegal = function(ipAddr){ var regIps = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|[0-9])\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|[0-9]))$/; return regIps.test(ipAddr); } /* IP地址转换为二进制字符串 */ /* 例如:172.16.4

[转帖]在 RHEL8 配置静态 IP 地址的不同方法

在 RHEL8 配置静态 IP 地址的不同方法 https://linux.cn/article-11390-1.html nmtui nmcli 命令和修改参数文件的方式. 作者: Pradeep Kumar 译者: LCTT heguangzhi | 2019-09-25 22:28 在 Linux 服务器上工作时,在网卡/以太网卡上分配静态 IP 地址是每个 Linux 工程师的常见任务之一.如果一个人在 Linux 服务器上正确配置了静态地址,那么他/她就可以通过网络远程访问它.在本文中

Linux主机IP地址配置

1 简述osi七层模型和TCP/IP五层模型 osi七层模型有如下层次构成: (1) 物理层:二进制传输,为启动.维护以及关闭物理链路定义了电气规范.机械规范.过程规范和功能规范: (2) 数据链路层:定义如何格式化数据以便进行传输以及如何控制对网络的访问,支持数据帧校验: (3) 网络层:路由数据包,选择传递数据包的最佳路径,支持寻址和路径选择: (4) 传输层:确保数据传输的可靠性:建立.维护和终止虚拟电路:通过错误检测和恢复:信息流控制保障可靠性: (5) 会话层:建立.管理和终止在应用程

[LeetCode] Restore IP Addresses 复原IP地址

Given a string containing only digits, restore it by returning all possible valid IP address combinations. For example:Given "25525511135", return ["255.255.11.135", "255.255.111.35"]. (Order does not matter) 这道题要求是复原IP地址,IP地