【Leetcode】468.验证IP地址

468.验证IP地址

题目

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

  • 如果是有效的 IPv4 地址,返回 “IPv4” ;
  • 如果是有效的 IPv6 地址,返回 “IPv6” ;
  • 如果不是上述类型的 IP 地址,返回 “Neither” 。

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

IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址

示例

示例 1:
输入:IP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"

示例 2:
输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"

示例 3:
输入:IP = "256.256.256.256"
输出:"Neither"
解释:既不是 IPv4 地址,又不是 IPv6 地址

示例 4:
输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334:"
输出:"Neither"

示例 5:
输入:IP = "1e1.4.5.6"
输出:"Neither"

方法

对于给定的字符串IP

  • 如果IP中有3个’.’那么其只可能是IPv4地址,不可能是IPv6地址,用validIPv4函数对其验证
    • 如果validIPv4返回true,那么是有效的IPv4地址,返回”IPv4”
    • 否则,返回”Neither”
  • 如果IP中有7个’:’那么其只可能是IPv6地址,不可能是IPv4地址,用validIPv6函数对其验证
    • 如果validIPv6返回true,那么是有效的IPv6地址,返回”IPv6”
    • 否则,返回”Neither”
  • 否则,IP不可能是有效的IPv4或IPv6地址,返回”Neither”

validIPv4()函数:

  • 用’.’将字符串IP进行分割。判断是否分割成了4块
  • 对于分割出的每一块,首先检查其长度(应在[1,3]之间),其次验0(在以’0’开头时长度只能为1),最后检查对应的值是否在0-255之间,并且每一位上是否都是数字

validIPv4()函数:

  • 用’:’将字符串IP进行分割。判断是否分割成了8块
  • 对于分割出的每一块,首先检查其长度(应在[1,4]之间),其次检查每个位对应的字符是否在0123456789abcdefABCDEF的范围内

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class Solution {
public String validIPAddress(String IP) {
int count1 = 0;
int count2 = 0;
for(int i = 0; i < IP.length(); i++){
count1 += IP.charAt(i) == '.' ? 1 : 0;
count2 += IP.charAt(i) == ':' ? 1 : 0;
}
if(count1 == 3){
if(validIPv4(IP))
return "IPv4";
else
return "Neither";
}
if(count2 == 7){
if(validIPv6(IP))
return "IPv6";
else
return "Neither";
}
return "Neither";
}

public boolean validIPv4(String IP){
//split函数以'.'来进行分割时,必须要加上转义字符\\
String[] strs = IP.split("\\.");
if(strs.length != 4)
return false;
for (String str : strs) {
if (str.length() < 1 || str.length() > 3)
return false;
if (str.charAt(0) == '0' && str.length() != 1)
return false;
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i)))
return false;
}
if(Integer.valueOf(str) > 255)
return false;
}
return true;
}

public boolean validIPv6(String IP){
String[] strs = IP.split(":");
if(strs.length != 8)
return false;
Set<Character> set = new HashSet<>();
for(int i = '0'; i <= '9'; i++)
set.add((char)i);
for(int i = 'a'; i <= 'f'; i++)
set.add((char)i);
for(int i = 'A'; i <= 'F'; i++)
set.add((char)i);
for(String str : strs) {
if(str.length() < 1 || str.length() > 4)
return false;
for(int i = 0; i < str.length(); i++) {
if(!set.contains(str.charAt(i)))
return false;
}
}
return true;
}
}