【算法训练】LeetCode#468 验证IP地址
一、描述
468. 验证IP地址
给定一个字符串 queryIP
。如果是有效的 IPv4 地址,返回 "IPv4"
;如果是有效的 IPv6 地址,返回 "IPv6"
;如果不是上述类型的 IP 地址,返回 "Neither"
。
有效的IPv4地址 是 “x1.x2.x3.x4”
形式的IP地址。 其中 0 <= xi <= 255
且 xi
不能包含 前导零。例如: “192.168.1.1”
、 “192.168.1.0”
为有效IPv4地址, “192.168.01.1”
为无效IPv4地址; “192.168.1.00”
、 “192.168@1.1”
为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8”
的IP地址,其中:
1 <= xi.length <= 4
xi
是一个 十六进制字符串 ,可以包含数字、小写英文字母('a'
到'f'
)和大写英文字母('A'
到'F'
)。- 在
xi
中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
和 "2001:db8:85a3:0:0:8A2E:0370:7334"
是有效的 IPv6 地址,而 "2001:0db8:85a3::8A2E:037j:7334"
和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334"
是无效的 IPv6 地址。
示例 1:
输入:queryIP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"
示例 2:
输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"
示例 3:
输入:queryIP = "256.256.256.256"
输出:"Neither"
解释:既不是 IPv4 地址,又不是 IPv6 地址
二、思路
这道题也没有什么算法或者数据结构相关的难点,就是依照条件做判别即可。
(毫无意义的一道题)
三、解题
public class LeetCode468 {
public static String validIPAddress(String queryIP) {
if (queryIP.contains(".")){
// 如果有‘ . ’则去判断是否为ipv4
if (judgeIPv4(queryIP)){
return "IPv4";
} else {
return "Neither";
}
} else if (queryIP.contains(":")){
// 如果有‘ : ’,则去判断是否为 IPV6
if (judgeIPv6(queryIP)){
return "IPV6";
}else {
return "Neither";
}
} else{
return "Neither";
}
}
// 判断ipv4
public static boolean judgeIPv4(String ip){
// 主要就是三点
// 1. 包含四个部分,x0.x1.x2.x3,
String[] ips = ip.split("\\.",-1); // 当出现1.2.3.3.时,回切分为‘1’,‘2’,‘3’,‘’,不回忽略最后的空字符
if (ips.length != 4){
// 如果长度不为4则一定不合法
return false;
}
for (String str : ips){
// 2. 不能有前导零
if (str == null || "".equals(str) || str.charAt(0) == '0' && str.length() != 1){
// 如果任意一段包含前导零(0.0这样合法因此判断长度)
return false;
}
char[] curStr = str.toCharArray();
int temp = 1; // 如果长度为3,则左侧就×100,为了转数字,判断是否在0-255
int num = 0;
for (int i = curStr.length-1 ; i >= 0 ; i-- ){
// 判断是否有非数字
if (curStr[i] - '0' < 0 || curStr[i] -'0' > 9){
return false;
}
num += temp*(curStr[i]-'0');
temp *= 10;
}
// 3. 每段范围在0-255
if (num > 255 || num < 0){
return false;
}
}
return true;
}
// 判断ipv6
public static boolean judgeIPv6(String ip){
// 主要就是三点
String[] ips = ip.split(":",-1);
if (ips.length != 8){
// 如果长度不为8则一定不合法
return false;
}
for (String str : ips){
if (str == null || "".equals(str) || str.length() < 1 || str.length() > 4){
// 如果任意一段长度不在1-4,不合法
return false;
}
char[] curStr = str.toCharArray();
for (char c : curStr){
// 判断是否在A-F或a-f或0-9
if (c>='A' && c<='F' || c>='a' && c<='f' || c>='0' && c<='9'){
continue;
}
return false;
}
}
return true;
}
public static void main(String[] args) {
validIPAddress("1.0.1.");
}
}