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){ 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; } }
|