题解 | #验证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; } }