题解 | #验证IP地址# 注意16进制与split的用法
验证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) {
//最后一位是 . split会忽略
if (IP.contains(".") && IP.lastIndexOf(".") != IP.length() - 1) {
//是IPv4 或者 Neither
boolean isOK = true;
String[] ips = IP.split("\\.");
if (ips.length == 4) {
for (int i = 0; i < ips.length; i++) {
String cur = ips[i];
if ("".equals(cur)) {
isOK = false;
break;
} else if (cur.startsWith("0") && cur.length() > 1) {
isOK = false;
break;
} else {
if (!isInteger(cur)) {
isOK = false;
break;
}
int value = Integer.valueOf(cur);
if (value < 0 || value > 255) {
isOK = false;
break;
}
}
}
} else {
isOK = false;
}
if (isOK) {
return "IPv4";
} else {
return "Neither";
}
} else if (IP.contains(":") && IP.lastIndexOf(":") != IP.length() - 1) {
//是IPv6 或者 Neither
boolean isOK = true;
String[] ips = IP.split(":");
if (ips.length == 8) {
for (int i = 0; i < ips.length; i++) {
String cur = ips[i];
if ("".equals(cur)) {
isOK = false;
break;
} else if (cur.length() > 4 || !isLegal(cur)) {
isOK = false;
break;
}
}
} else {
isOK = false;
}
if (isOK) {
return "IPv6";
} else {
return "Neither";
}
} else {
return "Neither";
}
}
private boolean isInteger(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length ; i++) {
char cur = chars[i];
if (cur > '9' || cur < '0') {
return false;
}
}
return true;
}
private boolean isLegal(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length ; i++) {
char cur = chars[i];
boolean isOk = false;
if ((cur >=0 && cur <= '9') || (cur >= 'a' && cur <= 'f') || (cur >= 'A' && cur <= 'F')) {
isOk = true;
}
if(!isOk){
return false;
}
}
return true;
}
}
