这道题难度真的不大,关键是判断条件要列全。各种奇葩的输入,你都要考虑得到(反正我是做不到,只能考一次一次的提交找到可能出现的一些很特殊的输入,进而为这些特殊条件加一层判断)。
import java.util.*;
public class Solution {
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
public String solve (String IP) {
// write code here
String rs = "Neither";
// 这个就是通过 IPV4 和 IPV6 分割字符的不同,大致判断它们应该归类到哪里进行判断
// 如果是 IPV4,那么通过 "\\." 切分,那么切分出来的字符串数组长度一定大于 1
// 注意:别忘了转义 "\\."
String[] judgement = IP.split("\\.");
// IPV4
if (judgement.length > 1) {
if (IP.split("\\.").length != 4) {
return "Neither";
}
else {
for (String str : IP.split("\\.")) {
if (!isFigure(str)) {
return "Neither";
}
else {
if (Integer.valueOf(str) < 0 || Integer.valueOf(str) > 255) {
return "Neither";
}
else {
if ((Integer.valueOf(str) + "").length() != str.length()) {
return "Neither";
}
}
}
}
rs = "IPv4";
}
}
// IPV6
else {
if (IP.split(":").length != 8) {
return "Neither";
}
if (IP.charAt(IP.length() - 1) == ':') {
return "Neither";
}
else {
for (String str : IP.split(":")) {
if (str.length() > 4) {
return "Neither";
}
if (isAllZeros(str)) {
return "Neither";
}
if (!isValid(str)) {
return "Neither";
}
}
rs = "IPv6";
}
}
return rs;
}
// IPV4,判断某一段是否是数字,如果存在字母,那肯定不合法
public boolean isFigure (String str) {
boolean rs = true;
for (char chr : str.toCharArray()) {
if (chr < '0' || chr > '9') {
rs = false;
break;
}
}
return rs;
}
// IPV6,判断某一段是否全是 0,如果是,那肯定不合法
public boolean isAllZeros (String str) {
if (str.length() == 1) {
return false;
}
boolean rs = true;
for (char chr : str.toCharArray()) {
if (chr != '0') {
rs = false;
break;
}
}
return rs;
}
// IPV6,判断某一段是否存在存在不在 0~9 a~f A~F 的字符,如果不在这三个范围内的字符,统一不合法
public boolean isValid (String str) {
boolean rs = true;
for (char chr : str.toCharArray()) {
if (!((chr >= 'a' && chr <= 'f') || (chr >= 'A' && chr <= 'F') || (chr >= '0' && chr <= '9'))) {
rs = false;
break;
}
}
return rs;
}
}