题解 | #验证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) {
// write code here
//用split方法把字符串分割成字符串数组
//对于IPv4,用.来分割成四节;IPv6,用:分割成8节
//再对于IPv4,判断每一节,第一个为0,则长度不能超过1;字符串转数字后只能在0-255
//对于IPv6,每一节由0-9以及a-e,A-E组成,长度不能超过四个
if (IP.contains(".")) {
//针对IPv4的
String [] parts = IP.split("\\.",-1);
if (parts.length != 4) {
return "Neither";
}
for (String part : parts) {
if (part.length() < 1 || part.length() > 3) {
return "Neither";
}
//首位为0,位数不是1
if (part.charAt(0) == '0' && part.length() > 1) {
return "Neither";
}
//不全是数字
for (char ch : part.toCharArray()) {
if (!Character.isDigit(ch)) {
return "Neither";
}
}
if (Integer.parseInt(part) < 0 || Integer.parseInt(part) > 255) {
return "Neither";
}
}
return "IPv4";
}
if (IP.contains(":")) {
//针对IPv6的
String [] parts = IP.split(":",-1);
if (parts.length != 8) {
return "Neither";
}
for (String part : parts) {
if (part.length() < 1 || part.length() > 4) {
return "Neither";
}
//除了数字,ae还有其他的
for (char ch : part.toCharArray()) {
if (!isHex(ch) ) {
return "Neither";
}
}
}
return "IPv6";
}
return "Neither";
}
private boolean isHex(char c) {
if (c >= '0' && c <= '9') {
return true;
}
if (c >= 'a' && c <= 'e') {
return true;
}
if (c >= 'A' && c <= 'E') {
return true;
}
return false;
}
}
这题主要在于split,分割,它是用正则表达式匹配的,所以要转义。并且可能出现空字符串,影响分割个数,应该用-1来限定分割成多少个,这一点很关键。
