题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
public String solve (String IP) {
// ip地址的类型,可能为
// IPv4, IPv6, Neither
if (isIpv4(IP)) {
// 判断是否为 IPv4
return "IPv4";
}
if (isIpv6(IP)) {
// 判断 是否为 Ipv6
return "IPv6";
}
// 既不是 IPv4 也不是 IPv6
return "Neither";
}
public boolean isIpv4(String ip) {
// ipv4
String[] strs = ip.split("\\.");
if (strs.length != 4) {
return false;
}
for (String s : strs) {
// 不能为空 不能出现 ..
if (s.length() == 0) {
return false;
}
// 不能出现 01
if (s.startsWith("0") && s.length() > 1 ) {
return false;
}
// 不能含非数字字符
for (char c : s.toCharArray()) {
if (!Character.isDigit(c)) {
return false;
}
}
// 范围 0-255
int num = Integer.valueOf(s);
if (num < 0 || num > 255) {
return false;
}
}
// 每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1
// IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
return true;
}
public boolean isIpv6(String ip) {
String[] strs = ip.split(":", -1);
// 不限制结果数组的大小,即返回所有可能的分割部分。
// 这样做可以确保保留以 : 分割的所有空字符串部分(如果有的话)。
if (strs.length != 8) {
return false;
}
// IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址
// 即,忽略 0 开头,忽略大小写
// 0 1 2 3 4 5 6 7 8 9 A B C D E F 进位
// 在十六进制表示中,有效的数字包括:
// 数字 0 到 9(对应 ASCII 值 48 到 57)
// 小写字母 a 到 f(对应 ASCII 值 97 到 102)
// 大写字母 A 到 F(对应 ASCII 值 65 到 70)
// 因此,条件表达式中的三个子表达式分别判断了以下情况:
// (c >= '0' && c <= '9'):字符 c 是否在数字 '0' 到 '9' 的范围内。
// ('a' <= c &&
// c <= 'f'):字符 c 是否在小写字母 'a' 到 'f' 的范围内。
// ('A' <= c &&
// c <= 'F'):字符 c 是否在大写字母 'A' 到 'F' 的范围内。
// 如果字符 c 满足以上任意一个子表达式的条件,则它可以被认为是一个十六进制数字。
for (String s : strs) {
if (s.length() == 0 || s.length() > 4 ) {
return false;
}
for (char c : s.toCharArray()) {
// 判断是不是十六进制数字
if ( !( (c >= '0' && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c &&
c <= 'F') ) ) {
// 不是十六进制数字 返回false
return false;
}
}
}
return true;
}
}

